題目描述
給定兩個代表非負數的連結清單,數字在連結清單中是反向存儲的(連結清單頭結點處的數字是個位數,第二個結點上的數字是百位數…),求這個兩個數的和,結果也用連結清單表示。
輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出: 7 -> 0 -> 8
分析
應遵循加法規則,從低位向高位相加,如果有進位要考慮進位。還要考慮連結清單長度問題。設定指針p1,p2分别指向兩個連結清單,第一個while循環,把他們公共的位相加,每位相加的時候都考慮低位的進位,以及向上的進位,這樣可以把兩個連結清單的公共位相加。之後的兩個while循環:while(p1 != null)和while(p2 != null)最多隻執行一個,這樣把長度長的連結清單也加上了。最後一個if,考慮最後一位是否還有進位。
java代碼
public class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode p1 = l1;
ListNode p2 = l2;
ListNode head = new ListNode(0);
ListNode p = head;
int carry = 0;
int sum = 0;
int local = 0;
while(p1 != null && p2 != null){
sum = p1.val + p2.val + carry;
local = sum%10;
p.next = new ListNode(local);
p = p.next;
carry = sum/10;
p1 = p1.next;
p2 = p2.next;
}
while(p1 != null){
sum = p1.val + carry;
local = sum%10;
//p1.val = local;
p.next = new ListNode(local);
p = p.next;
carry = sum/10;
p1 = p1.next;
}
while(p2 != null){
sum = p2.val + carry;
local = sum%10;
//p1.val = local;
p.next = new ListNode(local);
p = p.next;
carry = sum/10;
p2 = p2.next;
}
if(carry > 0){
p.next = new ListNode(carry);
}
return head.next;
}
}