这道题的主要精髓就是循环两个链表,将两个链表的元素相加,这个不难。
这道题的主要坑点是在于:
1.这两个可能一开始就有一个是空的,直接输出另一个链表。
2.相加的时候是有进位的,我们需要设一个bool变量,如果有进位下一位则加1,因为9+9最大也才18,进位一定是1。
3.在循环的过程中我们可能会遇到一个链表到结尾了,另外一个链表没到结尾的情况。我们则把剩下的不为null的链表输出。
4.在最后一位也有可能是进位,在循环执行完需要在判断一下如果有进位则在结果链表的末尾再加一个链结(1);
5.这一点是我踩的坑,在每次判断进位的时候如果不大于等于10,则要把bool变量flag设成false。其实不设flag设int可能好一些,
第一行是flag 的,第二行是int的。
resNum = l1.val + l2.val;
resNum = l1.val + l2.val + upNum;
以下是我通过的代码(JAVA语言)
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
if( l1 == null)
return l2;
if( l2 == null)
return l1;
ListNode result = new ListNode(0);
ListNode res = result;
int num = 0;
boolean flag = false;
while( l1 != null || l2 != null){
if( l1 == null)
l1 = new ListNode(0);
if( l2 == null)
l2 = new ListNode(0);
num = l1.val + l2.val;
if( flag)
num++;
if( num >= 10){
num = num % 10;
flag = true;
}else{
flag = false;
}
ListNode a= new ListNode(num);
res.next = a;
res = res.next;
l1 = l1.next;
l2 = l2.next;
}
if( flag)
res.next = new ListNode(1);
return result.next;
}
}
第二篇了。一定要努力。坚持才是胜利!