给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例 1:
输入:l1 = [2,4,3], l2 = [5,6,4] 输出:[7,0,8] 解释:342 + 465 = 807.
示例 2:
输入:l1 = [0], l2 = [0] 输出:[0]
示例 3:
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9] 输出:[8,9,9,9,0,0,0,1]
思路:定义sum,以及新链表,while循环中,从左往右对应结点相加的结果给sum,然后sum%10得到个位也就是新链表的第一位,sum/10作为进位的值也就是新的sum,放到下一次相加中。
while循环的条件是l1 || l2 || sum ,只要这仨有一个不为0就继续循环,把相加的结果添加到新链表中。
l1的最后一个数9(l1)+1(sum)=10 写0 进1(sum) ,此时l1、l2都是null,但是sum是1,所以还要进入循环,把sum放到新链表的下一个结点中。
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* dummy=new ListNode(0),*cur=dummy;
int sum=0;
while(l1||l2||sum) //循环条件别忘了sum,sum不为0时也能进入循环。
{
if(l1)
{
sum+=l1->val;
l1=l1->next;
}
if(l2)
{
sum+=l2->val;
l2=l2->next;
}
cur->next=new ListNode(sum%10);
cur=cur->next;
sum=sum/10; //进位值,参与下一轮循环的相加中。
}
return dummy->next;
}
};