LeetCode:Add Two Numbers

8028 ワード

markdownで書くのは初めてですね.もともと書くのが少ないので、やってみましょう.
タイトル: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つの整数を代表して、しかしすべての人はすべて1つのノードの中で保存して、今あなたに2つのチェーンテーブルをあげて、2つのチェーンテーブルを加えて、そしてチェーンテーブルの頭に戻って、私が考えることができるのは2つの考え方があります:
  • まず2つのチェーンテーブルの中の値を求めて、それから加算して、最後に得た値の一人一人を新しいチェーンテーブルを再作成して、チェーンテーブルの頭に戻って、チェーンテーブルの中の値が大きいかもしれないので、これはc++で書いて、あまり使いにくいかもしれません.大数加算はjavaがなくて便利で、これは書いていません.後で考えてみると、この考えはいいですが、通過できないと思います.書いてみると、BigIntegerというクラスを識別できません.
  • 直接加算、キャリー処理.
  • #include <iostream>
    #include <stdlib.h>   //   malloc    
    using namespace std;
    /** * Add Two Numbers Total Accepted: 55484 Total Submissions: 251336 My Submissions Question Solution * 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 */
    /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */
    struct ListNode {
        int val;
        ListNode *next;
        ListNode(int x) : val(x), next(NULL) {}
    };
    
    //             ,        
    ListNode * CreateLinkList(int a[], int n)
    {
        ListNode * head = (ListNode *)malloc(sizeof(ListNode));
        ListNode * beginhead = head;
    
        for (int i = 0; i<n; i++)
        {
            ListNode * node = (ListNode *)malloc(sizeof(ListNode));
            node->val = a[i];
            head->next = node;
            head = node;
        }
        head->next = NULL;
        return beginhead->next;
    }
    
    /** *        * */
    void Print(ListNode * head)
    {
        while (head != NULL)
        {
            cout << head->val << " ";
            head = head->next;
        }
    }
    class Solution {
    public:
        ListNode* addTwoNumbers(ListNode* l1, ListNode* l2)
        {
            int i = 1;
            int m = 0;
            ListNode *beginhead;
            ListNode * head = (ListNode*)malloc(sizeof(ListNode));
            beginhead = head;
            while (l1 != NULL && l2 != NULL)
            {
                int sum = (l1->val + l2->val);
                int n = sum%10;
                if (m == 1)
                    n = n + 1;
                m = sum / 10;
                ListNode * node = (ListNode *)malloc(sizeof(ListNode));
                node->next = NULL;
                node->val = n;
                if (n >= 10)
                { // {3,7} {9,2}
                    node->val = n % 10;
                    m = 1;
                }
                head->next = node;
                head = node;
    
                l1 = l1->next;
                l2 = l2->next;
            }
    
            if (l1!=NULL)
            {       //{9,9} {1}
                while (l1 != NULL)
                {
                    int l1Val = l1->val;
                    if (m == 1)
                        l1Val = l1->val+1;
                    m = l1Val / 10;
                    l1->val = l1Val % 10;  //      
                    head->next = l1;
                    head = head->next;
                    l1 = l1->next;
                }
    
                if (m == 1)
                {
                    ListNode * node = (ListNode*)malloc(sizeof(ListNode));
                    node->next = NULL;
                    head->next = node;
                    node->val = 1;
                }
                return beginhead->next;
            }
    
            if (l2 != NULL)
            {//{1}{9,9}
                while (l2 != NULL)
                {
                    int l2Val = l2->val;
                    if (m == 1)
                        l2Val =l2->val+1;
                    m = l2Val / 10;
                    l2->val = l2Val % 10;  //      
                    head->next = l2;
                    head = head->next;
                    l2 = l2->next;
                }
    
                if (m == 1)
                {
                    ListNode * node = (ListNode*)malloc(sizeof(ListNode));
                    node->next = NULL;
                    head->next = node;
                    node->val = 1;
                }
                return beginhead->next;
    
            }
            if (m == 1)
            {
                ListNode * node = (ListNode *)malloc(sizeof(ListNode));
                node->next = NULL;
                head->next = node;
                head = node;
                head->val = 1;
    
            }
            return beginhead->next;
    
        };
    };
    
    int main()
    {
    /** * {1} {9,9} * {9,9} {1} * {0} {0} * {3,7} {9,2} */
        int b[] = {3,7};
        int a[] = {9,2};
    
        ListNode *l1 = CreateLinkList(a, sizeof(a) / sizeof(int));
        ListNode *l2 = CreateLinkList(b, sizeof(b) / sizeof(int));
        Solution *s = new Solution;
        Print(s->addTwoNumbers(l1, l2));
        system("pause");
        return 0;
    }
    

    このプログラムは3、4時間くらい書いてあるので、ゆっくりしましょう.まず出会った問題やよく知っていることを話しましょう.ゆっくり書いて完成できますが、よく知りません.1.チェーンテーブルを作成するとき、最後の要素にNULLを割り当てないでください.これはデッドサイクルです.mallocというヘッダファイルはstdlibに含まれています.hこのヘッダファイルの中にあります.2.多くのテスト例が通じないような気がしますが、leetcodeはテスト例を示しています.これはいいと思います.間違っていますが、どこが間違っているか知っています.ゆっくりデバッグすることができます.3.malloc新しいnodeを作るときは、このnode->nextはすべてNULLを与えたほうがいい.