通过万岁!!!
- 题目:给定两个链表,每个节点是一个存储一个个位数(只能存储0-9),然后组合起来就是一个整数,但是是逆序的,例如123,在链表中顺序读取出来的话是321。要求就是两个链表求和。
- 思路:一个循环,然后一个变量存储是不是需要进位,因为每个节点还是只能存储0-9。不开辟新节点,用其中一个链表当作最终返回的链表。
- 技巧:无,我是没有发现什么技巧。但是这个题目里面还是有一些细节需要注意的。
- 一般判断当前节点的下一个节点是不是null来进行循环的退出。因此我们在一开始需要对当前节点进行一步单独的处理。并且在循环中我们操作的就是next,这样可以保证我们在循环中能操作next,也能操作本身。
- 一般遇到链表的时候,使用while循环。
伪代码
定义返回节点ans,指向l1,这样就不用开辟新节点了
计算两个链表的第一个节点
循环(任意一个节点的next不是空)
都不是空的情况
都指向next,我们对next操作
计算
l2是空,但是这时候l1一定还有,不然while就退出了
l1指向next
计算l1的val和temp
l1是空,同理这时候l2一定还有
这时候需要新new一个节点,让l1的next指向他,因为我们最后返回的就是l1
在最后返回之前,需要看一下是不是还有进位,如果有的话,说明还需要再加一个节点
返回ans即可
java代码
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode ans = l1;
l1.val += l2.val;
int temp = l1.val / 10;
l1.val %= 10;
while (l1.next != null || l2.next != null) {
if (l1.next != null && l2.next != null) {
l1 = l1.next;
l2 = l2.next;
l1.val = l1.val + l2.val + temp;
temp = l1.val / 10;
l1.val %= 10;
} else if (l1.next != null) {// l2是空了,只有l1
l1 = l1.next;
l1.val += temp;
temp = l1.val / 10;
l1.val %= 10;
} else {// 只有l2了,但是需要把内容都弄到l1上
l2 = l2.next;
l1.next = new ListNode((l2.val + temp) % 10);
temp = (l2.val + temp) / 10;
l1 = l1.next;
}
}
if (temp == 1) {// 还有进位
l1.next = l1.next = new ListNode(1);
}
return ans;
}
}
- 总结:这个题主要是麻烦,并不难。但是几个细节需要注意,就是我们判断next,然后while里面操作的就是next。