leetcode 2---両数加算(C言語版)

10845 ワード

タイトル
                      。  ,                    ,                   。

  ,           ,                 。

          0   ,         0   。

  :

  :(2 -> 4 -> 3) + (5 -> 6 -> 4)
  :7 -> 0 -> 8
  :342 + 465 = 807

構想設計
いくつかのチェーンテーブルの問題をした後、チェーンテーブルのヘッドポインタ、チェーンテーブルの表示、新しいノードの選択、浅い複製と深い複製に対する認識が不十分であることを発見し、問題をする時にはっきりしないことを発見し、Cの基礎をもう一度しなければならない.次の2つの方法は本題の問題解区の大物を参考にして、みんなは直接leetCodeに行って見ることができます.
メソッドの反復
2つのチェーンテーブルが空になるまでwhileループを使用して反復します.
struct ListNode *addTwoNumbers(struct ListNode *l1, struct ListNode *l2)
{
    int c = 0; //     
    struct ListNode *head, *cur, *next;
    head = (struct ListNode *)malloc(sizeof(struct ListNode));
    head->next = NULL;
    cur = head;
    while (l1 || l2 || c) //              。 c                    
    {
        next = (struct ListNode *)malloc(sizeof(struct ListNode));
        next->next = NULL;
        cur->next = next;
        cur = next;
        l1 != NULL ? (c += l1->val, l1 = l1->next) : (c += 0); //         ,   
        l2 != NULL ? (c += l2->val, l2 = l2->next) : (c += 0);
        cur->val = c % 10;  //         
        c = c / 10; //         
    }
    struct listNode *del = head;
    head = head ->next; //    ,          ,             ? 
    free(del); 
    return head;
}

メソッド2再帰
C変数はグローバル変数であり、int c=0の場合.関数に入れると、再帰cのたびにゼロになり、万が一2つの数が加算されて進位があればバグが発生します.
int c = 0;
struct ListNode *addTwoNumbers(struct ListNode *l1, struct ListNode *l2)
{
    if (!l1 && !l2 && 0 == c) //        ,    C     ,
    {						//            C     
        return NULL;		//(    ,  2 + 8 = 10,       ,     0 )
    }

    l1 != NULL ? (c += l1->val, l1 = l1->next) : (c += 0);
    l2 != NULL ? (c += l2->val, l2 = l2->next) : (c += 0);
    struct ListNode *cur = (struct ListNode *)malloc(sizeof(struct ListNode));
    cur->val = c % 10;
    c = c / 10;

    cur->next = addTwoNumbers(l1, l2); //              
    return cur;
}