其他分享
首页 > 其他分享> > 两个链表相加

两个链表相加

作者:互联网

package class04;

/***
 * 两个链表相加
 * 给定两个链表的头节点head1和head2
 * 认为从左到右是某个数字从低位到高位,返回相加之后的列表。
 * 例子1:4->3->6   2->5->3
 * 返回:6->8->9
 * 解释:634 + 352 = 986
 *
 * 例子2:3->5->2      4->4->9
 * 返回:7->9->1->1
 * 解释:253 + 944 = 1197
 */
// 测试链接:https://leetcode.com/problems/add-two-numbers/
public class Code05_AddTwoNumbers {
    //这个类不提交
    public static class ListNode {
        public int val;
        public ListNode next;

        public ListNode(int val) {
            this.val = val;
        }

        public ListNode(int val, ListNode next) {
            this.val = val;
            this.next = next;
        }
    }

    public static ListNode addTwoNumbers(ListNode head1, ListNode head2) {
        int size1 = listLength(head1);//获取链表1的长度
        int size2 = listLength(head2);//获取链表2的长度
        //如果链表1的长度大于等于链表2的长度,则返回head1,即较长链表的头节点。
        ListNode l = size1 >= size2 ? head1 : head2;
        //如果l就是head1,那么s就是head2(即head2就是较短链表的头节点);否则s就是head1(即head1就是较短链表的头节点。)
        ListNode s = l == head1 ? head2 : head1;

        ListNode curL = l;//当前轮的较长链表的头节点
        ListNode curS = s;//当前轮的较短链表的头节点
        //last:幽灵变量。始终指向当前回合的长链表的节点。
        //作用只有一个,就是在第3阶段,有进位时,知道新增的节点,挂在哪。
        ListNode last = curL;
        int carry = 0;//进位
        int curSum = 0;//当前回合,单链表的单个节点和短链表的单个节点的和。
        //阶段1:短链表没走完(那么长链表肯定也没走完)。
        while (curS != null) {
            curSum = curL.val + curS.val + carry;//当前回合,长链表节点的值+短链表节点的值+进位
            curL.val = curSum % 10;//将当前回合的和,对10取余,得到的值覆盖长链表的当前位置的值。
            carry = curSum / 10;//求得是否有进位,即carry是0还是1。
            //记录在当前回合,长链表的节点,跳步之前,的位置。
            last = curL;
            curL = curL.next;//长链表节点跳步。
            curS = curS.next;//短链表节点跳步。
        }
        //阶段2:短链表做完了,但是长链表还没走完。
        while (curL != null) {
            curSum = curL.val + carry;
            curL.val = curSum % 10;
            carry = curSum / 10;
            last = curL;
            curL = curL.next;
        }
        //阶段3:长链表和短链表都走完了。
        //判断是否有进位,如果没有进位,则结束,并返回。如果有进位,那么在长链表的尾结点的下一个节点,新增一个节点,并且值为1。
        if (carry != 0) {
            last.next = new ListNode(1);//新增节点,并且值为1,将它挂在长链表的尾结点的后一个位置。
        }

        return l;//较长链表的头节点
    }

    //获取链表的长度
    public static int listLength(ListNode head) {
        int size = 0;
        while (head != null) {
            size++;
            head = head.next;
        }
        return size;
    }

}

 

标签:ListNode,head1,val,相加,链表,两个,curL,节点
来源: https://www.cnblogs.com/TheFloorIsNotTooHot/p/16536039.html