1. 程式人生 > >LeetCode 2.兩數相加 Add Two Numbers (C語言)

LeetCode 2.兩數相加 Add Two Numbers (C語言)

題目描述:

給出兩個非空的連結串列用來表示兩個非負的整數。其中,它們各自的位數是按照逆序的方式儲存的,並且它們的每個節點只能儲存 一位 數字。
如果,我們將這兩個數相加起來,則會返回一個新的連結串列來表示它們的和。
您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。

示例:

輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807

題目解答:

方法1:正向遍歷+標誌位

將對應位置值相加,並加上上一次的標誌位的值,判斷和是否大於10,更新標誌位,大於10的情況下,和減去10就是當前位置的新值。
最開始考慮在原連結串列上直接操作,但由於兩個連結串列長度可能不一樣,這時候就需要將長連結串列剩餘的節點新增在已操作連結串列的尾部,重新連起來,意味著每次都需要更新儲存一下前一個節點,這樣方便連線剩餘節點,感覺邏輯會比較複雜,而且會破壞原連結串列,所以放棄這種方式(也可以解,大致思路一樣)。採用每個節點都重新申請空間的方式。
申請頭結點

,方便插入新節點,後邊遍歷的邏輯更清晰。一個標誌記錄當前兩個數字相加之後是否會產生進位,迴圈的條件為連結串列1節點、連結串列2節點、flag三者之一存在一個,在內部維持一個指標,記錄此時最後一個節點,用於追加新節點。執行時間20ms,程式碼如下。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* addTwoNumbers(struct ListNode* l1, struct
ListNode* l2) { int flag = 0, t = 0; struct ListNode* result = (struct ListNode*)malloc(sizeof(struct ListNode)); struct ListNode* head = result; while(l1 || l2 || flag) { struct ListNode* add = (struct ListNode*)malloc(sizeof(struct ListNode)); t = l1 ? l1->val : 0;
t += l2 ? l2->val : 0; t += flag; add->val = (t > 9 ? t - 10 : t); add->next = NULL; flag = (t > 9 ? 1 : 0); if(l1) l1 = l1->next; if(l2) l2 = l2->next; result->next = add; result = add; } result = head->next; free(head); return result; }