問題分析:
我們通過遍歷兩個鏈表拿到每個位的值,兩個值加上前一位進位值(0或者1)模10就是該位的值,除以10就是向高位的進位值(0或者1)。
由於兩個鏈表可以不一樣長,所以要及時判斷,一旦為null,該位的值就要變成0。
有一種情況比較特殊,比如:1->1->1->null, 9->8->8->null,最終結果為0->0->0->1->null,需要保留最高位。
而1->1->1->null, 9->8->7->null,最終結果為0->0->9->null,則不需要保留最高位,最后應該加一個判斷。
問題求解:
public class Solution { public ListNode addLists(ListNode l1, ListNode l2) { ListNode preListNode = new ListNode(0); ListNode nowListNode = new ListNode(0); ListNode resultListNode = null; int val = 0;// 當前位置的數 int add = 0;// 進位 while (l1 != null || l2 != null) { //該位的數值 val = ((l1 == null ? 0 : l1.val) + (l2 == null ? 0 : l2.val) + add) % 10; //對下一位產生的進位 add = ((l1 == null ? 0 : l1.val) + (l2 == null ? 0 : l2.val) + add) / 10; l1 = l1 == null ? l1 : l1.next;//判斷l1是否往下移動 l2 = l2 == null ? l2 : l2.next;//判斷l2是否往下移動 //nowListNode和nowListNode用來產生一個新的鏈表 nowListNode.val = val; if (resultListNode == null) { resultListNode = nowListNode; } preListNode = nowListNode; nowListNode = new ListNode(0); preListNode.next = nowListNode; } //最后還要多來一次判斷,因為有一種可能,兩個鏈表一樣長,最后一位又向上進了一位 val = ((l1 == null ? 0 : l1.val) + (l2 == null ? 0 : l2.val) + add) % 10; add = ((l1 == null ? 0 : l1.val) + (l2 == null ? 0 : l2.val) + add) / 10; nowListNode.val = val; //如果最后一位又向上進了一位,新的最后一位不為0,應該保留,否則就為0,應當舍棄 if(nowListNode.val == 0){ preListNode.next = null; } return resultListNode; } } class ListNode { int val; ListNode next; ListNode(int x) { val = x; next = null; } }