给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
示例1:
输入:l1 = [7,2,4,3], l2 = [5,6,4] 输出:[7,8,0,7]
示例2:
输入:l1 = [2,4,3], l2 = [5,6,4] 输出:[8,0,7]
示例3:
输入:l1 = [0], l2 = [0] 输出:[0]
代码如下:
//反转链表+两数相加
class Solution {
public:
ListNode* reverse(ListNode* head)//反转链表
{
ListNode* curr=head;
ListNode* prev=nullptr;
while(curr!=nullptr)
{
ListNode* temp=curr->next;
curr->next=prev;
prev=curr;
curr=temp;
}
return prev;
}
ListNode* addsum(ListNode* l1, ListNode* l2)//两数相加
{
ListNode* prev=new ListNode(0);//定义一个头节点之前的节点,为预先节点,防止在遍历的过程中丢失头节点
ListNode* curr=prev;//定义cur指针指向pre
int carry=0;//进位
while(l1!=nullptr||l2!=nullptr)
{
int x=l1==nullptr?0:l1->val;//当l1为null时,让l1补0,否则取l1的值
int y=l2==nullptr?0:l2->val;//当l2为null时,让l2补0,否则取l2的值
int sum=x+y+carry;//加上进位之后此时的和
carry=sum/10;//获得进位
sum=sum%10;//进位之后剩下的数字,余数
curr->next=new ListNode(sum);//创建新的链表,将余数存进新的链表里
curr=curr->next;//循环新链表
if(l1!=nullptr)
{
l1=l1->next;//遍历l1链表
}
if(l2!=nullptr)
{
l2=l2->next;//遍历l2链表
}
}
if(carry==1)
{
curr->next=new ListNode(carry);//当l1和l2都遍历完成之后,此时进位为1,开辟一个新的节点存放进位
}
return prev->next;//返回pre的下一个节点为新链表的头节点
}
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
l1=reverse(l1);//反转l1链表
l2=reverse(l2);//反转l2链表
ListNode* l3=addsum(l1,l2);//将反转后的两个链表相加得到l3
return reverse(l3);//反转l3链表
}
};