问题:
思路:
数据结构Java已经忘完了,对链表不是很熟悉,刚开始没有注意到ListNode是节点,,只存储 一位数字 的节点,然后吃了不少亏,后来迷过来之后就好多了,我写了详细的注释,希望能够有所帮助。如果存在问题,欢迎沟通~
代码:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode ln = new ListNode(0);// 声明一个节点,这个节点作为结果链表的第一个节点,初始值设置为0
ListNode cur = ln;// 指针指向这个节点
int m = 0;// 进位
while (l1 != null || l2 != null || m != 0) {
// l1和 l2 是不是空的,并且赋值给 a 和 b
int a = l1 == null ? 0 : l1.val;
int b = l2 == null ? 0 : l2.val;
int n = a + b + m;// 将两个数 还有进位过来的数相加
// 如果相加的和大于0,也就是有进位
if (n >= 10) {
m = n / 10;// 更新m
n = n % 10;
} else {
m = 0;// 更新m,我在这里跌倒过一次,导致程序终止不了
}
// 本来是不想区分的,但是如果不区分,最后的数字就会多一个0,有好的方法,欢迎讨论
if ((l1 == null ? l1 : l1.next) == null && (l2 == null ? l2 : l2.next) == null && m == 0) {
cur.val = n;
cur.next = null;//如果可以判断出来,不需要下一轮了,那就让下一个节点为空,当然这里也可以用break,直接终结掉
} else {
// 赋值,并完成下一轮更替
cur.val = n;// 将给此节点复制
ListNode lne = new ListNode();// 声明一个新的节点,作为下一个
cur.next = lne; // 链接
cur = lne;// 让指针指向新的节点,这个地方我也跌倒过一次,注意cur是指针,让他去指向下一轮会用到的节点
}
//让l1、l2都指向下一个,但是要先判断本身是不是空的
if (l1 != null) {
l1 = l1.next;
}
if (l2 != null) {
l2 = l2.next;
}
}
return ln;//返回结果链表
}
}