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;
}
}