【LeetCode每日一題 Day 2】2. 兩數相加
阿新 • • 發佈:2021-07-01
大家好,我是程式設計熊,今天是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/
我是程式設計熊,致力於讓大家都成為更好的人,歡迎 『關注』、『點贊』、『轉發』支援~