问题分析:
我们通过遍历两个链表拿到每个位的值,两个值加上前一位进位值(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; } }