半路出家菜鸟一枚,在接触这道题之前对链表的了解仅限于概念方面,不知道链表的代码如何实现,现学现卖吧。下面先上代码:
/**
* 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) {
ListNode Sum = new ListNode(0);
ListNode add1 = l1;
ListNode add2 = l2;
ListNode curr = Sum;
int x, y, psum;
int carry = 0;
while (add1 != null || add2 != null){
x = add1 == null ? 0 : add1.val;
y = add2 == null ? 0 : add2.val;
psum = x + y + carry;
carry = psum / 10;
curr.next = new ListNode(psum %10);
if(add1 != null)
add1 = add1.next;
if(add2 != null)
add2 = add2.next;
curr = curr.next;
}
if(carry != 0){
curr.next = new ListNode(carry);
}
return Sum.next;
}
}
以上,是我参考了leetcode上面提供的Solution,在我参照之前,脑子里能勾勒出大概流程,但是作为一个欠缺编程经验的程序员,我有以下几个方面没有考虑到:
1.不知道如何遍历链表各个节点的值,目前我只能理解明白类似于add1 = add1.next; 这种,大概意思是指向下一节点,但是不明白为什么要定义add1和add2这两个,感觉直接用l1和l2也可以,但是不知道这样会不会对l1和l2有所改变;
2.每一步都应该及时判断add1和add2是否为空,即看看是否走到了链表的最后一个节点,这里我觉得要注意的一点是,判断是否走到最后一个节点的作用,不仅仅在于决定了加数是否为0,而且在指向下一个节点的时候,如果此时已经走到了最后(最后一个节点的.next指向为空),就不能再将add1和add2指向下一个节点了,那样个人觉得代码会报空指针的错误;
3.对于结果链表Sum来说,相当于一个空链表,所以每一次往里面存数的时候都需要new出来一个节点;
4.考虑进位问题,这是我一开始没有想到的。
以后会继续更新,也许刚看完一遍现在理解的也有错,后续发现会把错误更改,各位同行发现麻烦指正。