leetcode 2 -- Add Two Numbers


leetcode 2 – 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
題意:2つのチェーンテーブル、各ノードは1つの非負の値を保存してしかも0-9で、2つのチェーンテーブルを加算してそしてキャリーを含んで、上のInputの4と6ノードが対応することを見て、4+6=10で、だから1は次のノードにキャリーして、現在のノードと10の余剰数0、最終的に合計した後の1つのチェーンテーブルに戻ります.簡単に言えば、この問題は巨大数の加算に似ていて、チェーンテーブルで実現されています.
考え方:私の考えはその中の1つのチェーンテーブルを借りて返すことができて、もう1つのチェーンテーブルの対応する値を加えて、新しい和を求めるチェーンテーブルを作成していないで、比較的に空間を節約して、注意しなければならない点は1です.どのチェーン時計が長いか分かりません.2.[9,9,9,9,9]および[1]のような循環キャリーがある可能性があり、結果は[0,0,0,0,1]である.3.最後のノードにキャリーがあるかどうかに注意し、newの新しいノードが必要になる場合があります.
コード:
/** * 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) { 
        //p q      
        ListNode *head = NULL, *p, *q;
        ListNode *head1 = l1, *head2 = l2;
        int t;
        //bef      ,    0
        int bef = 0;
        //               
        while(l1 != NULL && l2 != NULL){
            t = l1->val + l2->val + bef;
            //       10,    1,   0
            if(t >= 10){
                l1->val = t%10;
                bef = 1;
            }else{
                l1->val = t;
                bef = 0;
            }
            //                         
            p = l1;
            q = l2;
            l1 = l1->next;
            l2 = l2->next;
        }
        head = head1;
        /*    l1     ,    l1 l2 ,   l1      next     l2 l1      */
        //       
        if(l1 == NULL && l2 == NULL){
            if(bef == 1){
                p->next = new ListNode(bef);
            }   
        }else if(l1 == NULL || l2 == NULL){
            //  l1   l2     
            if(l1 == NULL)
                p->next = q->next;
            //                  
            while(p->next != NULL){
                p->next->val += bef; 
                if(p->next->val >= 10){
                    p->next->val %= 10;
                    p = p->next;
                    bef = 1;
                }else{
                    bef = 0;
                    break;
                }
            }
            //             new     
            if(bef == 1){
                p->next = new ListNode(1);
            }
        }
        return head;
    }
};