菜鳥刷leetcode 2.Add Two Numbers

最原始的想法是先比較兩個鏈表的大小,然後把和加到較長的那個鏈表上。也是這樣做的。但是由於對鏈表的理解有點欠缺,而且進位方面考慮不夠周全,於是寫了一上午都沒對。讓大付幫忙改了一下,改對了。

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裏面有一個是新建一個鏈表,然後用尾插法把和直接賦值到新鏈表。這樣的方法時間就多了很多。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章