LeetCode 解題報告 - 2. Add Two Numbers
從今天開始,寫一下我在刷 LeetCode 時的心得體會,包括自己的思路和別人的優秀思路,歡迎各種監督啊! 2016/10/9
程式語言是 Java,程式碼託管在我的 GitHub 上,包括測試用例。歡迎各種批評指正!
<br />
題目 —— Add Two Numbers
You are given two linked lists representing two non-negative numbers. 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.
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
<br >
解答
題目大意
給出兩個連結串列,代表非負整數,每一位數字反向儲存在一個結點中。將兩個數字相加,並以連結串列形式返回。-
解題思路
- 我們先來審題,反向儲存意味著我們從連結串列頭部開始加即可,這樣省去了不少麻煩,唯一存在的問題是考慮進位。
我們在寫程式碼的時候,先考慮返回值,既然是返回一個連結串列,我們就必須知道頭結點的指標。那麼怎樣遍歷連結串列呢?所以我們需要兩個指標,一個指向頭部的位置,一個是活動的指標,隨著元素的新增而移動。
-
我們在計算結果的時候,是不是把 l1 連結串列和 l2 連結串列對應結點上的值加起來就行了?是的,再加上一個變數 carry 來表示進位即可。這裡的關鍵在於迴圈退出的條件:
- 兩條連結串列不一定等長,所以我們 while 迴圈中使用
||
來把兩條連結串列都遍歷到。 - 兩條連結串列都遍歷完的時候,carry 值可能不為 0。同樣的,使用邏輯符號
||
即可解決問題,對於 sum 的計算,我們使用問號表示式。
- 兩條連結串列不一定等長,所以我們 while 迴圈中使用
最後,記得對 l1 和 l2 的指標進行步進,否則就陷入無限迴圈啦。
程式碼實現
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode prev = new ListNode(0);
ListNode tmp = prev;
int carry = 0;
int sum = 0;
while (l1 != null || l2 != null || carry != 0) {
sum = ((l1 == null) ? 0 : l1.val) + ((l2 == null) ? 0 : l2.val) + carry;
carry = sum / 10;
sum %= 10;
tmp.next = new ListNode(sum);
l1 = (l1 == null) ? l1 : l1.next;
l2 = (l2 == null) ? l2 : l2.next;
tmp = tmp.next;
}
return prev.next;
}
}
-
小結
由於數字儲存是倒序的,這個問題總體來說比較好解決。需要注意的問題就是,迴圈退出的條件。另外,對於空連結串列的處理上,問號表示式也是比較取巧的一種方式。
相關文章
- LeetCode 2. Add Two NumbersLeetCode
- LeetCode 2 Add Two NumbersLeetCode
- LeetCode-2 Add Two NumbersLeetCode
- LeetCode2: Add two numbers(兩數相加)LeetCode
- Fifth. LeetCode 2:Add Two Numbers 兩數之和LeetCode
- Add_Two_Numbers python 求解Python
- leetcode 兩數相加(add two numbers) Python程式設計實現LeetCodePython程式設計
- Leetcode Weekly Contest 95解題報告LeetCode
- LeetCode Weekly Contest 96 解題報告LeetCode
- leetcode 解題 2.兩數相加-python3 題解LeetCodePython
- Leetcode Weekly Contest94 解題報告LeetCode
- 421-Maximum XOR of Two Numbers in an Array
- LeetCode #1:Two Sum(簡單題)LeetCode
- Leetcode 第136場周賽解題報告LeetCode
- [LeetCode 刷題] 2. 兩數相加LeetCode
- 【LeetCode】253. Meeting Rooms II 解題報告(C++)LeetCodeOOMC++
- Leetcode 165 Compare Version NumbersLeetCode
- Leetcode 67 Add BinaryLeetCode
- Leetcode 231 Power of TwoLeetCode
- Leetcode 1 two sumLeetCode
- LeetCode | 1 Two SumLeetCode
- [題解]SP10606 Balanced Numbers
- Leetcode 967 Numbers With Same Consecutive DifferencesLeetCode
- 【LeetCode】416. Partition Equal Subset Sum 解題報告(Python & C++)LeetCodePythonC++
- [LeetCode] 258. Add DigitsLeetCodeGit
- Leetcode 29 Divide Two IntegersLeetCodeIDE
- LeetCode-1 Two SumLeetCode
- [LeetCode]1.Two SumLeetCode
- LeetCode | 349 Intersection Of Two ArraysLeetCode
- Leetcode 231. Power of TwoLeetCode
- python: leetcode - 1 Two SumPythonLeetCode
- [題解]CF55D Beautiful Numbers
- CF878E Numbers on the blackboard 題解
- 題解:UVA13185 DPA Numbers I
- LeetCode 129. Sum Root to Leaf NumbersLeetCode
- [LeetCode] 282. Expression Add OperatorsLeetCodeExpress
- LeetCode 之 JavaScript 解答第一題 —— 兩數之和(Two Sum)LeetCodeJavaScript
- leetcode-29. Divide Two IntegersLeetCodeIDE
- Leetcode 21 Merge Two Sorted ListsLeetCode