菜鸟刷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里面有一个是新建一个链表,然后用尾插法把和直接赋值到新链表。这样的方法时间就多了很多。

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