题目链接:2. 两数相加 - 力扣(LeetCode) (leetcode-cn.com)
1.题目描述
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。
示例1.
>输入:l1=[2,4,3], l2=[5,6,4]
>输出:[7,0,8]
>解释:342+465=807
示例2.
>输入:l1=[9,9,9,9,9,9,9], l2=[9,9,9,9]
>输出:[8,9,9,9,0,0,0,1]
>解释:9999999+9999=10009998
2.题目分析
该题需要注意的一点是每条链表的数字都是按照逆序的方式存储的,所以两个链表的同一位置的数字是可以直接相加的。
因此,我么你可以同时遍历两个链表,对同一位置的数字进行相加求和。假设两个链表对应位置的数字为n1和n2,同时需要一个进位carry,则 相应位置的数字应该为(n1+n2+carry)%10;而新的进位carry=(n1+n2+carry)/10;
如果链表长度不一样,那么就认为长度较短的链表后面是若干个0;
并且,当链表遍历完成以后,如果carry>0;就必须将进位当做一个新的结点尾插进去。进店的值为carry。
3.代码
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode head=null;ListNode tail=null;
int carry=0;
while(l1!=null||l2!=null){
int n1=l1!=null?l1.val:0; //n1和n2用来存放l1和l2结点的值
int n2=l2!=null?l2.val:0;
int sum=n1+n2+carry; //求和,并且加上进位
if(head==null){
head=tail=new ListNode(sum%10);
}else{
tail.next=new ListNode(sum%10);
tail=tail.next;
}
carry=sum/10;
if(l1!=null){
l1=l1.next;
}
if(l2!=null){
l2=l2.next;
}
}
if(carry>0){
tail.next=new ListNode(carry); //若产生进位,就将进位作为一个结点返回;
}
return head;
}
}