LeetCode#2-Add Two Numbers-兩數相加

一、題目

給出兩個 非空 的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,並且它們的每個節點只能存儲 一位 數字。

如果,我們將這兩個數相加起來,則會返回一個新的鏈表來表示它們的和。

您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。

示例:

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

二、題解

特殊情況:
1)一個鏈表比另一個鏈表長;
2)一個鏈表爲空,另一個鏈表不爲空;
3)求和運算可能出現進位。

具體步驟:
1)設置一個啞節點,並將當前節點初始化爲這個啞節點;
2)將進位 carry 初始化爲 0;
3)遍歷列表 l1 和 l2 直至到達它們的尾端:
① 將 x 設爲 l1 的節點。如果 x 已經到達 l1 的末尾,則將其值設置爲 0;
② 將 y 設爲 l2 的節點。如果 y 已經到達 l2 的末尾,則將其值設置爲 0;
③ 和爲 Sum = x + y + carry
④ 更新進位的值 carry = Sum / 10
⑤ 和對 10 取餘,Sum = Sum % 10;創建這個結果的節點,並將其設置爲當前結點的下一個節點,同時將當前節點前進到下一個節點;
4)如果兩個鏈表全部遍歷完畢後,進位值 carry = 1,則在新鏈表最前方添加節點 1;
5)返回啞節點的下一個節點。

時間複雜度:O(n),空間複雜度:O(n)。

function addTwoNumbers($l1, $l2) {
    $carry = 0;
    $dummyHead = new ListNode(0);
    $cur = $dummyHead;
    while ($l1 !== null || $l2 !== null) {
        echo $carry . "<br>";
        $x = $l1 == null ? 0 : $l1->val;
        $y = $l2 == null ? 0 : $l2->val;
        $sum = $carry + $x + $y;
        $carry = floor($sum / 10);
        $sum = $sum % 10;
        $cur->next = new ListNode($sum);
        $cur = $cur->next;

        if ($l1 !== null) {
            $l1 = $l1->next;
        }
        if ($l2 !== null) {
            $l2 = $l2->next;
        }
    }
    if($carry == 1) {
        $cur->next = new ListNode($carry);
    }
    return $dummyHead->next;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章