最原始的想法是先比较两个链表的大小,然后把和加到较长的那个链表上。也是这样做的。但是由于对链表的理解有点欠缺,而且进位方面考虑不够周全,于是写了一上午都没对。让大付帮忙改了一下,改对了。
typedef struct ListNode ListNode;
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
ListNode* head1=(ListNode*)malloc(sizeof(ListNode)*1);
ListNode* head2=(ListNode*)malloc(sizeof(ListNode)*1);
head1->next=l1;
head2->next=l2;
ListNode* ptemp=(ListNode*)malloc(sizeof(ListNode)*1);
int len1=1,len2=1,wei=0;
while(l1!=NULL)
{
len1++;
l1=l1->next;
}
while(l2!=NULL)
{
len2++;
l2=l2->next;
}
l1=head1->next;
l2=head2->next;
if(len1==len2)
{
while(l1!=NULL)
{
l1->val+=l2->val+wei;
wei=l1->val/10;
l1->val=l1->val%10;
ptemp=l1;
l1=l1->next;
l2=l2->next;
}
if(wei>0)
{
ListNode* p=(ListNode *)malloc(sizeof(ListNode)*1);
p->val=wei;
p->next=NULL;
ptemp->next=p;
}
return head1->next;
}
else if(len1>len2)
{
while(l2!=NULL)
{
l1->val+=l2->val+wei;
wei=l1->val/10;
l1->val=l1->val%10;
l1=l1->next;
l2=l2->next;
}
while(l1!=NULL)
{
l1->val+=wei;
wei=l1->val/10;
l1->val=l1->val%10;
ptemp=l1;
l1=l1->next;
}
if(wei>0)
{
ListNode* p=(ListNode *)malloc(sizeof(ListNode)*1);
p->val=wei;
p->next=NULL;
ptemp->next=p;
}
return head1->next;
}
else
{
while(l1!=NULL)
{
l2->val+=l1->val+wei;
wei=l2->val/10;
l2->val=l2->val%10;
l1=l1->next;
l2=l2->next;
}
while(l2!=NULL)
{
l2->val+=wei;
wei=l2->val/10;
l2->val=l2->val%10;
ptemp=l2;
l2=l2->next;
}
if(wei>0)
{
ListNode* p=(ListNode *)malloc(sizeof(ListNode)*1);
p->val=wei;
p->next=NULL;
ptemp->next=p;
}
return head2->next;
}
return NULL;
}
据大付说,这道题是前两天b厂的面试题。这道题还真是不难,但是要考虑的地方很多。一不小心就会出错。
后来看大付写的程序,原来不用比较链表大小,直接加到l1上,然后判断如果l1小,直接把l2赋值给l1,这样就省去了一点时间。
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
int add=0,sum=0;
ListNode* head=new ListNode(-1);
head->next=l1;
l1=head;
while(l1->next && l2){
sum=add+l1->next->val+l2->val;
add=sum/10;
sum=sum%10;
l1->next->val=sum;
l1=l1->next;
l2=l2->next;
}
if(l2) l1->next=l2;
while(l1->next){
sum=l1->next->val+add;
add=sum/10;
sum%=10;
l1->next->val=sum;
l1=l1->next;
}
if(add>0)
{
ListNode* bit=new ListNode(add);
l1->next=bit;
}
return head->next;
}
};
discuss里面有一个是新建一个链表,然后用尾插法把和直接赋值到新链表。这样的方法时间就多了很多。