Add Two Numbers —— leet code 每天一練
You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.
You may assume the two numbers do not contain any leading zero, except the number 0 itself.
Example: Input: (2 -> 4 -> 3) + (5 -> 6 -> 4) Output: 7 -> 0 -> 8 Explanation: 342 + 465 = 807.
給出兩個非空的非負的整數連結串列。他們所代表了數字不同位數的反序儲存,並且每個節點只能儲存一位數字。
現在你要將這兩個數字想加,返回一個新的連結串列表示它們的和。
你可以假設除了數字0之外,這兩個數都不會以0開頭。
解法
// typescript interface IListNode<T> { val: T; next: IListNode<T> | null; } function addTwoNumbers(l1: IListNode<number> | null, l2: IListNode<number> | null) => { let result: IListNode<number> = { val: 0, next: null }; let dvi = 0; let last: IListNode<number> = result; while (!!l1 || !!l2) { let sum = 0; if (l1) { sum += l1.val; } if (l2) { sum += l2.val; } sum += dvi; dvi = sum / 10 >>> 0; const node = { val: sum % 10, next: null }; last.next = node; last = last.next; l1 = l1 && l1.next; l2 = l2 && l2.next; } if (dvi > 0) { last && (last.next = { val: dvi, next: null }); } return result.next; };
執行情況:
Runtime: 124 ms, faster than 81.49% of JavaScript online submissions for Add Two Numbers. Memory Usage: 39 MB, less than 18.38% of JavaScript online submissions for Add Two Numbers.
複雜度分析:
-
時間內負責度: O(max(m, n)). 假設 m 和 n 分別表示 l1 和 l2 的長度,上面的演算法最多從重複了 max(m, n) 次。
-
空間複雜度: O(max(m, n)). 新列表的長度最大為 max(m, n) + 1.
總結:
這道題比較簡單,沒什麼好說的….
不過反向思考,這道題是否可以解決大數想加問題,比如 2^63 * 2^63 之類的運算 ? 舉一反三,做完題多思考