给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 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]
代码如下:
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* pre=new ListNode(0);//定义一个头节点之前的节点,为预先节点,防止在遍历的过程中丢失头节点
ListNode* cur=pre;//定义cur指针指向pre
int carry=0;//进位
while(l1!=nullptr||l2!=nullptr)
{
int x=l1==nullptr?0:l1->val;//当l1为0时,让l1补0,否则取l1的值
int y=l2==nullptr?0:l2->val;//当l2为0时,让l2补0,否则取l2的值
int sum=x+y+carry;//加上进位之后此时的和
carry=sum/10;//获得进位
sum=sum%10;//进位之后剩下的数字,余数
cur->next=new ListNode(sum);//将余数存进新的链表里
cur=cur->next;//循环新链表
if(l1!=nullptr)
{
l1=l1->next;//循环l1链表
}
if(l2!=nullptr)
{
l2=l2->next;//循环l2链表
}
}
if(carry==1)
{
cur->next=new ListNode(carry);//当l1和l2都遍历完成之后,此时进位为1,开辟一个新的节点存放进位
}
return pre->next;//返回pre的下一个节点为新链表的头节点
}
};