1. 程式人生 > 其它 >【LeetCode每日一題 Day 2】2. 兩數相加

【LeetCode每日一題 Day 2】2. 兩數相加

大家好,我是程式設計熊,今天是LeetCode每日一題的第二天,一起學習的是LeetCode第二題《兩數相加》。

題意

給你兩個 非空 的連結串列,表示兩個非負的整數。它們每位數字都是按照 逆序 的方式儲存的,並且每個節點只能儲存 一位 數字。

請你將兩個數相加,並以相同形式返回一個表示和的連結串列。

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

示例

輸入:l1 = [2,4,3], l2 = [5,6,4]
輸出:[7,0,8]
解釋:342 + 465 = 807.

題解

因為連結串列是逆序的,所以兩個連結串列可以從頭開始逐位相加,但兩個連結串列可能不一樣長,對於短的連結串列可以高位補 0


需要注意的是,遍歷完兩個連結串列後,最高位需要進位而額外增加一位。

時間複雜度: O(n)n 為兩個連結串列中較長的長度。

空間複雜度: O(1)

知識點總結: 連結串列

C++程式碼

class Solution {
public:
    ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) {
        ListNode* head = new ListNode();
        ListNode* currentPos = head;
        int v = 0;
        while(l1 || l2 || v) {
            int v1 = l1 ? l1->val : 0, v2 = l2 ? l2->val : 0;
            int res = (v + v1 + v2) / 10;
            v = (v1 + v2 + v) % 10;
            currentPos->val = v;
            v = res;
            if (l1) l1 = l1->next;
            if (l2) l2 = l2->next;
            if (l1 || l2 || v) {
                currentPos->next = new ListNode();
                currentPos = currentPos->next;
            }
        }
        return head;
    }
};

Java程式碼

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode head = new ListNode();
        ListNode currentPos = head;
        int v = 0;
        while (l1 != null || l2 != null || v != 0) {
            int v1 = l1 != null ? l1.val : 0;
            int v2 = l2 != null ? l2.val : 0;
            int res = (v + v1 + v2) / 10;
            v = (v + v1 + v2) % 10;
            currentPos.val = v;
            v = res;
            if (l1 != null) l1 = l1.next;
            if (l2 != null) l2 = l2.next;
            if (l1 != null || l2 != null || v != 0) {
                currentPos.next = new ListNode();
                currentPos = currentPos.next;
            }
        }
        return head;
    }
}

題目連結: https://leetcode-cn.com/problems/add-two-numbers/

我是程式設計熊,致力於讓大家都成為更好的人,歡迎 『關注』、『點贊』、『轉發』支援~