leetcode-02-Add Two Sum

2.Add Two Sum(两数之和)
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
在这里插入图片描述
链接:https://leetcode-cn.com/problems/add-two-numbers

输入的时342和465。但是上面的显式形式是通过reverse而来的。
个位—>十位—>百位。
其实上面给的是理想状态下的数。我们举一个应该满足所有测试点的数
9<----5<----6
7<----4
①:两个数有位数相互重合的部分,比如上面的个位和十位
②:第一个数的最高位比第二个数的最高位高1
③:相加的新数是否会产生新的进位。比如十位进位到百位,但是百位的数是9,进位+1.此时又要进位。此时需要创建的一个新的结点存储最高进位。

先看第①种情况:针对于百位
sum=L1+L2+carry //carray是前一位的进位,在这个例子中就是5+7+carry
val=sum%10 //val是此时节点的值(val是处理过的)
carry=sum/10 //看看十位上的进位,进给百

第②中情况:一个list已经结束了,但是另外一个list还剩余一个节点
sum=L1+carry //高位节点的值+进位。比如上面的例子:9+1(1是进位)
val=sum/%10;
carry=sum/10;

第③中情况:看看②中的carry是否等于1
如果carry==1,----->产生值为1的ListNode

模拟一下过程:
9<----5<----6
7<----4
我们要返回的是结果的首结点,在之前创建一个dumy结点,current指针指向结点dumy。
模拟①:sum=10;
当前结点的val=0
carry=1
新的结点更新的carray的值,current.next指向新的结点,并移动current指向新建的结点,并且L1和L2移向下一位
sum=13
val=13%10;
carry=13/10=1;
current.next指向新的结点,并移动current
情况②:
单一节点的值+carry,val=10,那么当前的节点是0,carry=1
.current指向新的结点
情况③:
如果carry=1,那么就产生一个新的结点,并存放carry,current指向新的结点
最后返回的是dumy.next
代码如下:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        //判断输入是否有效
        if(l1==null) return l2;
        if(l2==null) return l1;
        //建立一个dumy结点
        ListNode dumy=new ListNode(0);
        //建立current结点首先指向dumy结点,并初始化carry=0
        ListNode current=dumy;
        int carry=0;
        //处理第一种情况,两个list,l1和l2都有有效的结点
        while(l1!=null&&l2!=null){
            int dig=l1.val+l2.val+carry;
            int val=dig%10;//不管进不进位,此时百位的数字位val
            carry=dig/10;
            ListNode nownode=new ListNode(val);//当前结点
            current.next=nownode;
            current=current.next;
            l1=l1.next;
            l2=l2.next;
        }
        //9<--5<--6 :l1 is not null
        //    7<--4 :l2 is null
        //l1不空,但l2是空的
        while(l1!=null){
            int val=(l1.val+carry)%10;
            carry=(l1.val+carry)/10;
            current.next=new ListNode(val);
            current=current.next;
            l1=l1.next;
        }
        while(l2!=null){
            int val=(l2.val+carry)%10;
            carry=(l2.val+carry)/10;
            current.next=new ListNode(val);
            current=current.next;
            l2=l2.next;
        }
        //最后处理第三种情况
        //9<--5<--6 
        //    7<--4 
        //第三种还有可能产生千位进位的情况给
        if(carry!=0) current.next=new ListNode(carry);
        return dumy.next;
    }
}
发布了16 篇原创文章 · 获赞 0 · 访问量 231

猜你喜欢

转载自blog.csdn.net/weixin_44110100/article/details/105474081
今日推荐