一道比较基本的LinkedList的题目。题目要求是这样,现在有两个LinkedList,(2 -> 4 -> 3)和(5 -> 6 -> 4),然后从头开始,把每个node的value相加,最终输出的结果应该是:(7 ->0 ->8)。这里需要注意的边界条件有两个,一个是两个链表长度不一样的问题,另一个是进位的问题,注意了这两个问题以后,问题就比较好解决了。
具体的代码如下:
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ public class Solution { public ListNode addTwoNumbers(ListNode l1, ListNode l2) { //对于链表来说,当需要处理头节点head的时候,本人比较喜欢用一个dump node, 通过 //dump node来指向头节点,从而省去很多判断是否为head的情况。最后返回dumpNode.next即可 ListNode dumpNode = new ListNode(0); //用add来纪录是否进位。 int add = 0; ListNode curr = dumpNode; while (l1 != null && l2 != null) { int sum = l1.val + l2.val + add; //记录是否该进位,当sum > 9,则需要进位。 if (sum > 9) { sum = sum % 10; add = 1; } else add = 0; curr.next = new ListNode(sum); curr = curr.next; l1 = l1.next; l2 = l2.next; } //l1长度>l2,则进入该循环,注意进位。 while (l1 != null) { int sum = l1.val + add; if (sum > 9) { sum = 0; add = 1; } else add = 0; curr.next = new ListNode (sum); curr = curr.next; l1 = l1.next; } //l2 > l1的情况 while (l2 != null) { int sum = l2.val + add; if (sum > 9) { sum = 0; add = 1; } else add = 0; curr.next = new ListNode(sum); curr = curr.next; l2 = l2.next; } //这个容易漏掉,来说明最后是否进位,如 [5]和[5]最终应输出[0->1] if (add == 1) curr.next = new ListNode(1); return dumpNode.next; } }