演算法-兩數相加

weixin_34239169發表於2018-07-07

/* 給定兩個非空連結串列來表示兩個非負整數。位數按照逆序方式儲存,它們的每個節點只儲存單個數字。將兩數相加返回一個新的連結串列。 你可以假設除了數字 0 之外,這兩個數字都不會以零開頭。

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

*/

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
    struct ListNode* l3 = (struct ListNode*)malloc(sizeof(struct ListNode));
    struct ListNode* n1 = l1;
    struct ListNode* n2 = l2;
    struct ListNode* n3 = l3;
    int carry = 0;
    while (1) {
        int c1 = 0;
        int c2 = 0;
        if (n1 != NULL) {
            c1 = n1->val;
            n1 = n1 ->next;
        }
        if (n2 != NULL) {
            c2 = n2->val;
            n2 = n2 ->next;
        }
        int sum = c1 + c2 + carry;
        carry = sum /10;
        int currentValue = sum % 10;
        n3->val = currentValue;
        //考慮進位有值得情況需要進入下一個迴圈
        if(n1 != NULL || n2 != NULL || carry)
        {
            struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode));
            n3->next = newNode;
            n3 = n3 ->next;
        }
        else
        {
        //最後一個節點為NULL
            n3 ->next = NULL;
            break;
        }
    }
   
    return l3;
}
複製程式碼

小結:程式導向的思路。 注意的幾個問題:

  1. 進位問題,低位相加得出進位值提供給高位計算。
  2. 最後一輪相加的時候可能會產生進位,這個時候需要進入下一輪迴圈,計算下一位的值。

待完善L('ω')┘三└('ω')」....

相關文章