给定两个非空链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储单个数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 0
之外,这两个数字都不会以零开头。
进阶:
如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。
示例:
输入: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
输出: 7 -> 8 -> 0 -> 7
这题的思路比较多,可以考虑将链表先反转,然后相加,得到结果后再反转回来即可。
也可以考虑用递归。如果不修改原始链表也可以考虑用栈来实现。递归和栈的实现思路是一样的,只是实现的方式不同而已。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
if(l1==NULL||l1->val==0) return l2;
if(l2==NULL||l2->val==0) return l1;
stack*>st1,st2;
while(l1||l2){
if(l1){
st1.push(l1);
l1=l1->next;
}
if(l2){
st2.push(l2);
l2=l2->next;
}
}
ListNode *root= new ListNode(1);
int flag=0;
while(!st1.empty()||!st2.empty()){
ListNode *p=new ListNode(0);
int tmp1=0,tmp2=0;
if(!st1.empty()){
tmp1=st1.top()->val;
st1.pop();
}
if(!st2.empty()){
tmp2=st2.top()->val;
st2.pop();
}
//cout<" "<val=(tmp1+tmp2+flag)%10;
flag=(tmp1+tmp2+flag)/10;
p->next=root->next;
root->next=p;
}
return flag==1?root:root->next;
}
};