题目
给定两个非空链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储单个数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
进阶:
如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。
示例:
输入: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
输出: 7 -> 8 -> 0 -> 7
分析:
先求两个链表长度,让长的那一个先走差距步,然后将短链表节点的值依次与长链表剩下的对应元素相加,然后将链表值拷贝到一个vector中,在vector中进行进位操作后,然后将元素拷回长链表,需要注意的是,如果最后一次还有进为的话
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* x=l1;
ListNode* y=l2;
//计算两个链表长度
int c1=0;
while(x)
{
c1++;
x=x->next;
}
int c2=0;
while(y)
{
c2++;
y=y->next;
}
int diff=c1-c2;//两个链表差距
if(diff>0)
{
x=l1;
y=l2;
}
else
{
x=l2;
y=l1;
}
//x指向长链表,y指向短链表
ListNode* last=x;
diff = abs(diff);
while(x && diff--)
{
x=x->next;
}
//相加
while(x && y)
{
x->val=x->val+y->val;
x=x->next;
y=y->next;
}
//借助vector进位
vector<int> v;
v.push_back(0);//占最前面一位防止最后一次进位值没地方放
x=last;
while(x)
{
v.push_back(x->val);
x=x->next;
}
for(int i=v.size()-1;i>0;i--)
{
v[i-1]+=v[i]/10;//加上进位
v[i]%=10;//余数
}
x=last;
if(v[0]!=0)
{
ListNode*newnode = new ListNode(v[0]);
newnode->next=x;
last=newnode;
}
//元素值拷到链表中去
int i=1;
while(x)
{
x->val=v[i++];
x=x->next;
}
return last;
}