两数相加,从尾部开始,所以,链表的头部应该是数字的尾部,依次向数字的头部串联
应该设置三个链表,两个链表用来储存需要相加的数,一个链表用来存储相加之后的结果。将链表对应位置进行相加,记录sum值,此时相加之后该位置的值应为sum%10,该位置的进位carry为sum/10,下一位置时,该位置的值为**(sum+carry)%10**,进位为**(sum+carry)/10**,所以为了方便,我们一开始就设置一个carry,并将其值设为0。
以上的想法只能满足两个数字的相同位数的情况,还应考虑一些事情,如果两个数字位数不同,相加时空出来的一方用0代替。
可以实现相加之后,考虑返回值,返回的必须是链表的头部
所以在多次相加的循环里,我们需要一个空的头部链表
在循环结束后,他可以帮我们找到数字,我们就可以依次将他们输出了
因为两个链表对应位置相加后,指针就会分别移动到下一位置,循环结束时指针在链表的尾部,但是链表只能从前往后输出。
class Solution{
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode pre = new ListNode(0);//头部链表
ListNode cur = pre;
pre.next=cur;//从cur开始存储数字
int carry = 0;//开始进位设为0
while(l1 != null || l2 != null) {
int x = l1 == null ? 0 : l1.val;//若l1,l2有一方为null ,则他的值改为0与另一方相加
int y = l2 == null ? 0 : l2.val;
int sum = x + y + carry;
carry = sum / 10;
sum = sum % 10;
cur.next = new ListNode(sum);
cur = cur.next;
if(l1 != null)//指针移动
l1 = l1.next;
if(l2 != null)
l2 = l2.next;
}
if(carry == 1) {//当循环结束(两数字各位都相加完成后)进位不为零,此时需要向前进一
cur.next = new ListNode(carry);//在链表末端补一
}
return pre.next;//返回头节点
}
}