[LeetCode] Add Two Numbers

4707 ワード

Add Two Numbers
You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4) Output: 7 -> 0 -> 8
問題解決の考え方:
この問題には難点はありません.最後の進位の罠に注意すればいいです.私がしなければならないのは、結果をより完璧に表現する方法です.主にトップ加算と他のビット加算の違いを考慮する.最初はif文を使っていました.コードは次のとおりです.
/**
 * 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* p = l1, *q=l2;
        ListNode* result = new ListNode(0), *r=result;  //r        
        int over = 0;   //  
        bool first = true;  //   
        
        while(p!=NULL&&q!=NULL){
            int addNum = p->val + q->val + over;
            // addNum    [0, 19]
            if(!first){
                r->next=new ListNode(0);
                r=r->next;
            }
            r->val = addNum % 10;
            over = addNum / 10;
            
            p=p->next;
            q=q->next;
            
            first = false;
        }
        
        if(q!=NULL){
            p=q;
        }
        
        while(p!=NULL){
            int addNum = p->val + over;
            if(!first){
                r->next=new ListNode(0);
                r=r->next;
            }
            r->val = addNum % 10;
            over = addNum / 10;
            
            p=p->next;
            
            first = false;
        }
        
        if(over!=0){
            r->next=new ListNode(0);
            r=r->next;
            r->val = over;
        }
        
        return result;
    }
};
ここでは、怠け者の布のように、分かりにくいです.そこで、第2版が呼び出された.
/**
 * 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* result = new ListNode(0), *r=result;  //r        
        
        result->val = (l1->val + l2->val)%10;
        
        int over = (l1->val + l2->val)/10;
        
        ListNode* p = l1->next, *q=l2->next;
        
        while(p!=NULL&&q!=NULL){
            int addNum = p->val + q->val + over;
            r->next=new ListNode(0);
            r=r->next;
            r->val = addNum % 10;
            over = addNum / 10;
            
            p=p->next;
            q=q->next;
        }
        
        if(q!=NULL){
            p=q;
        }
        
        while(p!=NULL){
            int addNum = p->val + over;
            r->next=new ListNode(0);
            r=r->next;
            r->val = addNum % 10;
            over = addNum / 10;
            
            p=p->next;
        }
        
        if(over!=0){
            r->next=new ListNode(0);
            r=r->next;
            r->val = over;
        }
        
        return result;
    }
};
は以前より少し良いですが、ここではl 1とl 2の少なくとも1つのノードがデフォルトであり、依然として美しくありません.第3版が出た.
/**
 * 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* result = new ListNode(0), *r=result;  //r        
        
        ListNode* p = l1, *q=l2;
        int over = 0;
        
        while(p!=NULL&&q!=NULL){
            int addNum = p->val + q->val + over;
            r->next=new ListNode(0);
            r=r->next;
            r->val = addNum % 10;
            over = addNum / 10;
            
            p=p->next;
            q=q->next;
        }
        
        if(q!=NULL){
            p=q;
        }
        
        while(p!=NULL){
            int addNum = p->val + over;
            r->next=new ListNode(0);
            r=r->next;
            r->val = addNum % 10;
            over = addNum / 10;
            
            p=p->next;
        }
        
        if(over!=0){
            r->next=new ListNode(0);
            r=r->next;
            r->val = over;
        }
        
        r = result;
        result = result->next;
        delete r;
        
        return result;
    }
};
人はこのような処理方式が好きで、先にヘッダノードが設けられていて、その後の処理方式はすべて同じで、それからヘッダノードを削除します.