问题描述:你有两个用链表代表的整数,其中每个节点包含一个数字。数字存储按照在原来整数中相反
的顺序,使得第一个数字位于链表的开头。写出一个函数将两个整数相加,用链表形式返回和。
样例
给出两个链表 3->1->5->null
和 5->9->2->null
,返回 8->0->8->null
解题思路:新建一个链表里面的节点其实就是其他两个节点加和对10取余数。在设置一个整型变量对加和的值除10,得到的数就是要进的位数,按题目要求插在链表后面就可以了
实现代码:
class Solution {
public:
ListNode *addLists(ListNode *l1, ListNode *l2) {
ListNode *dummy= new ListNode(0);
ListNode *temp=dummy;
if(l1==NULL)return l2;
if(l2==NULL)return l1;
int i=0,n=0;
while(l1!=NULL&&l2!=NULL){
public:
ListNode *addLists(ListNode *l1, ListNode *l2) {
ListNode *dummy= new ListNode(0);
ListNode *temp=dummy;
if(l1==NULL)return l2;
if(l2==NULL)return l1;
int i=0,n=0;
while(l1!=NULL&&l2!=NULL){
n=(l1->val+l2->val+i)%10;
i=(l1->val+l2->val+i)/10;
dummy->next=new ListNode(n);
l1=l1->next;
l2=l2->next;
dummy=dummy->next;
}
while(l1!=NULL){
n=(l1->val+i)%10;
i=(l1->val+i)/10;
dummy->next=new ListNode(n);
l1=l1->next;
dummy=dummy->next;
}
while(l2!=NULL){
n=(l2->val+i)%10;
i=(l2->val+i)/10;
dummy->next=new ListNode(n);
l2=l2->next;
dummy=dummy->next;
}
if(i!=0) dummy->next= new ListNode(i);
return temp->next;
}
};
i=(l1->val+l2->val+i)/10;
dummy->next=new ListNode(n);
l1=l1->next;
l2=l2->next;
dummy=dummy->next;
}
while(l1!=NULL){
n=(l1->val+i)%10;
i=(l1->val+i)/10;
dummy->next=new ListNode(n);
l1=l1->next;
dummy=dummy->next;
}
while(l2!=NULL){
n=(l2->val+i)%10;
i=(l2->val+i)/10;
dummy->next=new ListNode(n);
l2=l2->next;
dummy=dummy->next;
}
if(i!=0) dummy->next= new ListNode(i);
return temp->next;
}
};
感悟:
链表求和很容易,关键是对于大于10的数的处理,这题请教了别人,自己想的太简单了,提交几次都不成功,问了别人后,知道自己在处理进位的时候没处理好,有一个技巧
n=(l1->val+l2->val+i)%10;i=(l1->val+l2->val+i)/10;在这两句代码上,看懂了之后,其他的就简单了,对于长度不一样的链表,依次插到新链表的后面就行了。