題目地址:https://leetcode-cn.com/problems/add-two-numbers/
題目:
給定兩個非空鏈表來表示兩個非負整數。位數按照逆序方式存儲,它們的每個節點只存儲單個數字。將兩數相加返回一個新的鏈表。
你可以假設除了數字 0 之外,這兩個數字都不會以零開頭。
示例:
輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807
試題分析:
這道題是一道雙鏈表操作題,如果第一次做該題還是需要多調試不是那么簡單,在整個實現過程中有幾個小技巧,因為兩個鏈表的長度可能是不同的,并且在相加的過程中會存在不斷進位的情況,所以我們可以給結果鏈表增加一個虛擬頭節點,簡化第一個節點的操作,再增加一個進位符來表示下個待處理的兩個鏈表節點相加是否要進位,在兩個鏈表節點相加的時候要同時加上進位符,并更新進位符值。
最后還要防止如果兩個鏈表都遍歷結束,進位符還有值則需要新增一個值為1的節點。
代碼:
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode head = new ListNode(0);
ListNode result = head;
int ten = 0;//進位符
//整個算法中利用三元運算符判空,并對操作數字賦0來保證判斷邏輯簡單
for(;l1!=null || l2!=null;
l1=l1==null?null:l1.next,
l2=l2==null?null:l2.next,
result=result.next){
int val1 = l1==null?0:l1.val;
int val2 = l2==null?0:l2.val;
result.next = new ListNode((val1+val2+ten)%10);
ten = (val1+val2+ten)/10;
}
if(ten>0){
//如果遍歷結束后還有一位進位符有值則加尾節點并賦值
result.next = new ListNode(ten);
}
//頭節點為無效哨兵節點,需要返回next
return head.next;
}
源碼路徑:com.monkey01.linkedlist.AddTwoNumbers_2
配套測試代碼路徑:test目錄com.monkey01.linkedlist.AddTwoNumbers_2Test