最原始的想法是先比較兩個鏈表的大小,然後把和加到較長的那個鏈表上。也是這樣做的。但是由於對鏈表的理解有點欠缺,而且進位方面考慮不夠周全,於是寫了一上午都沒對。讓大付幫忙改了一下,改對了。
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裏面有一個是新建一個鏈表,然後用尾插法把和直接賦值到新鏈表。這樣的方法時間就多了很多。