題目鏈接
https://leetcode-cn.com/problems/add-two-numbers/
題目描述
給出兩個(gè) 非空 的鏈表用來(lái)表示兩個(gè)非負(fù)的整數(shù)。其中,它們各自的位數(shù)是按照 逆序 的方式存儲(chǔ)的,并且它們的每個(gè)節(jié)點(diǎn)只能存儲(chǔ) 一位 數(shù)字。
如果,我們將這兩個(gè)數(shù)相加起來(lái),則會(huì)返回一個(gè)新的鏈表來(lái)表示它們的和。
您可以假設(shè)除了數(shù)字 0
之外,這兩個(gè)數(shù)都不會(huì)以 0
開(kāi)頭。
示例:
輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807
解題方案
思路
- 使用進(jìn)位變量carry存放進(jìn)位值
- 使用一個(gè)假頭節(jié)點(diǎn)dummyHead來(lái)鏈接“結(jié)果鏈表”,詳見(jiàn)畫(huà)解
代碼
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode dummyHead = new ListNode(0);
ListNode curr = dummyHead;//當(dāng)前節(jié)點(diǎn)與dummyHead共同鏈接到curr.next
int carry = 0;//用于進(jìn)位,進(jìn)位為1,默認(rèn)為0
while (l1 != null || l2 != null) {//使用||,因?yàn)閘1和l2可能長(zhǎng)度不一致
int x = (l1 == null ? 0 : l1.val);//三元運(yùn)算符避免l1.val報(bào)錯(cuò)
int y = (l2 == null ? 0 : l2.val);
int sum = x + y + carry;//carry為0時(shí),對(duì)結(jié)果沒(méi)有影響
carry = sum / 10;//取整,0或1
curr.next = new ListNode(sum % 10);//取余
curr = curr.next;//當(dāng)前節(jié)點(diǎn)變?yōu)橄乱粋€(gè)節(jié)點(diǎn),循環(huán)的關(guān)鍵
if (l1 != null)//不能為空,否則l1.next報(bào)錯(cuò)
l1 = l1.next;//l1.next可以為空
if (l2 != null)
l2 = l2.next;//l2.next與l1.next均為空時(shí),結(jié)束循環(huán),避免無(wú)限循環(huán)
}
if (carry == 1) {//[5]+[5]->[10]
curr.next = new ListNode(carry);
}
return dummyHead.next;//首節(jié)點(diǎn)不要
}
}
畫(huà)解
1.png
2.png
3.png
4.png
5.png
6.png
7.png
8.png
測(cè)試用例
輸入 | 情況 |
---|---|
l1=[0,1],l2=[0,1,2] | 長(zhǎng)度不一致 |
l1=[],l2=[0,1] | 一個(gè)為空 |
l1=[9,9],l2=[1] | 進(jìn)位 |