这题有两种解法思路,1.递归,2.循环。
1.递归
最开始是想添加一个新方法专门做递归,后来考虑直接用第一个参数l1作为result。
首先考虑l1或者l2为空的情况,直接return另一个链表就行。
在两个链表都为不为空的时候将l1和l2的数字加起来赋值给l1,然后处理一下超过10的情况,之后将l1.next和l2.next进行递归就行。
在提交的时候发现有一种可能就是在l2为null的时候,l1刚好因为进位达到了10,导致结果错误,所以对l2==null的情况下也做一个递归处理就ok了。
public ListNode addTwoNumbers(ListNode l1, ListNode l2) { if (l1 == null) { if (l2 == null) { return null; } else { return l2; } } else { if (l2 == null) { return this.addTwoNumbers(l1, new ListNode(0)); } else { int val = l1.val + l2.val; if (val >= 10) { if (l1.next == null) { l1.next = new ListNode(1); } else { l1.next.val++; } val %= 10; } l1.val = val; } l1.next = this.addTwoNumbers(l1.next, l2.next); return l1; } }
2.循环
循环需要维护一个进位数carry,如果两个链表有一个不为空,或者进位>0,就执行循环。
循环中给next进行赋值,一定不要忘记最后需要把next的指针进位,指向下一个next。
public ListNode addTwoNumbers(ListNode l1, ListNode l2) { ListNode result = new ListNode(0); ListNode next = result; int carry = 0; while (l1 != null || l2 != null || carry > 0) { int sum = carry; if (l1 != null) { sum += l1.val; l1 = l1.next; } if (l2 != null) { sum += l2.val; l2 = l2.next; } carry = sum / 10; next.next = new ListNode(sum % 10); next = next.next; } return result.next; }