アルゴリズムの意図的な練習-LeetCode戦闘10- 2つの数値

タイトル:2つの数値

元の質問へのリンク: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 *head = new ListNode();
        ListNode *p = head;
        int temp = 0;
        while(l1 != NULL && l2 != NULL)
        {
            ListNode *q = new ListNode();
            p->next = q;
            p = p->next;
            temp = l1->val + l2->val + temp;
            if(temp < 10)
            {
                p->val = temp; 
                temp = 0;
            }
            else
            {
                p->val = temp - 10;
                temp = 1;
            }  
            l1 = l1->next;
            l2 = l2->next;
        }
        while(l1 != NULL)
        {
            ListNode *q = new ListNode();
            p->next = q;
            p = p->next;
            temp = l1->val + temp;
            if(temp < 10)
            {
                p->val = temp; 
                temp = 0;
            }
            else
            {
                p->val = temp - 10;
                temp = 1;
            }
            l1 = l1->next;           
        }
        while(l2 != NULL)
        {
            ListNode *q = new ListNode();
            p->next = q;
            p = p->next;
            temp = l2->val + temp;
            if(temp < 10)
            {
                p->val = temp; 
                temp = 0;
            }
            else
            {
                p->val = temp - 10;
                temp = 1;
            }
            l2 = l2->next; 
        }
        if(temp == 1)
        {
            ListNode *q = new ListNode();
            p->next = q;
            p = p->next;
            p->val = 1;

        }
        return head->next;
    }
};

そして、これは公式の答えを見つけるために見て、彼女はリフレッシュに見え、明らかに時間エレガントなコードではありません。次のとおりです。

/**
 * 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 *head = new ListNode();
        ListNode *p = head;
        int carry = 0;
        while(l1 != NULL || l2 != NULL)
        {
            int x = (l1 != NULL)?l1->val:0;
            int y = (l2 != NULL)?l2->val:0;
            int sum = carry + x + y;
            p->next = new ListNode(sum % 10);
            p = p->next;
            carry = sum / 10;
            if(l1 != NULL) l1 = l1->next;
            if(l2 != NULL) l2 = l2->next;
        }
        if(carry != 0)
            p->next =new ListNode(1);
        return head->next;
    }
};

その公式のJavaを考えると、私はC ++に変換する彼を置きます。実際にはとても美しく見える〜

余談:

彼は、米国が書いた、その後、いくつかの言う「美しい花がないが、」そのような不満を持っていることが予想されて過ごすことになります言った:「両方の美しい花が美しい花ではありませんがあります」これは、誰もがテキストを表現呼び出すことはできません同意するように、基本的にナンセンスです。
-鈴木光司

公開された16元の記事 ウォンの賞賛0 ビュー277

おすすめ

転載: blog.csdn.net/DZZ18803835618/article/details/104766656