445. Add Two Numbers II
You are given two linked lists representing two non-negative numbers. The most significant digit comes first and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.
You may assume the two numbers do not contain any leading zero, except the number 0 itself.
Follow up:
What if you cannot modify the input lists? In other words, reversing the lists is not allowed.
Example:
Input: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4) Output: 7 -> 8 -> 0 -> 7
思路:用一个数组vector<ListNode*>pre,存储可能会因为进位val有改变的节点。首先定义一个伪节点p(0)来存储最后的结果,当然,pre中初始时就一个p。下面考虑从高位到低位加的时候,怎么进位。如果当前位的和小于9,它肯定不会进位,则将当前pre清空,只存入当前的节点。如果当前位和恰好为9,它可能会因为下一位的进位对当前位的更高位产生影响,因此因加入pre。我们可以想象,一般pre只有一个元素,当pre内有多个元素时,除了它的第一位不是9,其他位必定都是9,这是针对可能出现连续进位的情形。当前位的和大于9,即产生进位时,pre里所有在当前位之前的位就开始+1,在对10取余,然后pre里的数再次清空,压入当前位的val。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
int len(ListNode* l)
{
int cnt=0;
while(l)
{
cnt++;
l=l->next;
}
return cnt;
}
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
if(l1->val==0&&!l1->next) return l2;
if(l2->val==0&&!l2->next) return l1;
if(len(l1)<len(l2)) return addTwoNumbers(l2, l1);
int n1=len(l1),n2=len(l2);
int diff=n1-n2;
int i=0;
ListNode* p=new ListNode(0);
ListNode* r=p;
vector<ListNode*> pre;
pre.push_back(p);
while(i<diff)
{
ListNode* t=new ListNode(l1->val);
p->next=t;
l1=l1->next;
p=p->next;
if(t->val<9)
pre.clear();
pre.push_back(t);
i++;
}
while(i<n1)
{
int v=l1->val+l2->val;
ListNode* t=new ListNode(v%10);
p->next=t;
if(v>9)
{
for(auto it:pre)
(it->val)=(it->val+1)%10;
pre.clear();
pre.push_back(t);
}else if(v==9)
pre.push_back(t);
else
{
pre.clear();
pre.push_back(t);
}
l1=l1->next;
l2=l2->next;
p=p->next;
i++;
}
if(r->val!=0) return r;
else return r->next;
}
};