题目描述
给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。你可以假设除了数字 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* revserse(ListNode* b)
{
ListNode* pre=nullptr;
while(b)
{
auto t=b->next;
b->next=pre;
pre=b;b=t;
}
return pre;
}
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
auto a=revserse(l1),b=revserse(l2);
ListNode* dummpy=new ListNode(-1);
ListNode* c=dummpy;
int t=0;
while(a || b || t)
{
if(a) t+=a->val;a=a->next;
if(b) t+=b->val;b=b->next;
c->next=new ListNode(t%10);
t=t/10;
c=c->next;
}
auto res=revserse(dummpy->next);
return res;
}
};
在得到结果值时可以边翻转边做,类似于两个节点之间插入temp节点。比如头结点是dummpy,下一个节点是nullptr,需要将temp节点插入到dummpy和下一个节点之间。这样就相当于倒着插入节点,后续就不需要翻转了。
class Solution {
public:
ListNode* revserse(ListNode* b)
{
ListNode* pre=nullptr;
while(b)
{
auto t=b->next;
b->next=pre;
pre=b;b=t;
}
return pre;
}
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
auto a=revserse(l1),b=revserse(l2);
ListNode* dummpy=new ListNode(-1);
ListNode* c=dummpy;
int t=0;
while(a || b || t)
{
if(a) t+=a->val;a=a->next;
if(b) t+=b->val;b=b->next;
auto temp=new ListNode(t%10);
temp->next=dummpy->next;
dummpy->next=temp;
t=t/10;
}
return dummpy->next;
}
};