1. 程式人生 > >【leetcode】第2題 C++

【leetcode】第2題 C++

題目:

給定兩個非空連結串列來表示兩個非負整數。位數按照逆序方式儲存,它們的每個節點只儲存單個數字。將兩數相加返回一個新的連結串列。

你可以假設除了數字 0 之外,這兩個數字都不會以零開頭。

【自己寫的版本】:比較垃圾。。。所以後面看了官方的又寫了改進版

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { 
        ListNode* NewLink=new ListNode(0);
        ListNode* NewLinkRear=NewLink;
        int add=0;
        while(l1!=NULL&&l2!=NULL){
            if(NewLinkRear->next!=NULL)
            {NewLinkRear=NewLinkRear->next;}
            
            NewLinkRear->val=l1->val+l2->val+add;
            ListNode* newnode=new ListNode(0);
            NewLinkRear->next=newnode;
            if(NewLinkRear->val>=10){
                add=1;
                NewLinkRear->val%=10;  
            }else{
                add=0;  
            }
            l1=l1->next;
            l2=l2->next;     
    };   
        if(l1==NULL&&l2!=NULL){
            NewLinkRear->next=l2;
            while(add){ 
                l2->val+=1;
                l2->val>=10?add=1:add=0;
                l2->val%=10; 
                if(l2->next!=NULL){
                    l2=l2->next;
                }else{
                    if(add){
                ListNode* AddNode=new ListNode(0);
                AddNode->val=add;
                l2->next=AddNode;
                add=0;
                   }else{
                 l2->next=NULL;
                  }
                }
            }
        }else if(l1!=NULL&&l2==NULL){
            NewLinkRear->next=l1;
            while(add){ 
                l1->val+=1;
                l1->val>=10?add=1:add=0;
                l1->val%=10; 
                if(l1->next!=NULL){
                    l1=l1->next;
                }else{
                    if(add){
                ListNode* AddNode=new ListNode(0);
                AddNode->val=add;
                l1->next=AddNode;
                add=0;
                   }else{
                 l1->next=NULL;
                  }
                }
            }
            
        }else{
            if(add){
                ListNode* AddNode=new ListNode(0);
                AddNode->val=add;
                 NewLinkRear->next=AddNode;
                add=0;
            }else{
                 NewLinkRear->next=NULL;
            }
           
        }
        
       return  NewLink;      
};
    
       
    
};

【參考官方後寫的改進版】:

class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { 
        ListNode* NewLink=new ListNode(0);
        ListNode* NewLinkRear=NewLink;
        int add=0;
        while(l1!=NULL||l2!=NULL){
            int val1=l1==NULL?0:l1->val;
            int val2=l2==NULL?0:l2->val;
                
            if(NewLinkRear->next!=NULL)
            {NewLinkRear=NewLinkRear->next;}
            
            NewLinkRear->val=val1+val2+add;NewLinkRear->val>=10?add=1:add=0;
            ListNode* newnode=new ListNode(0);
            NewLinkRear->next=newnode;
            NewLinkRear->val%=10; 
            
            if(l1!=NULL) l1=l1->next;
            if(l2!=NULL) l2=l2->next;     
    };   
        if(add){
            ListNode* newnode=new ListNode(1);
            NewLinkRear->next=newnode;
        }else{
            NewLinkRear->next=NULL;
        }
       
        
       return  NewLink;      
};
        
};