從今天開始,寫一下我在刷 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;
}
}
-
小結
由于數字存儲是倒序的,這個問題總體來說比較好解決。需要注意的問題就是,循環退出的條件。另外,對于空鏈表的處理上,問號表達式也是比較取巧的一種方式。