题目
给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储 一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。
示例1:
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807
示例2:
输入:l1 = [0], l2 = [0]
输出:[0]
示例3:
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]
代码
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode NewHead = new ListNode();
ListNode cur = NewHead;
int tmp = 0;
int x;
int y;
while (l1 != null || l2 != null) {
if (l1 == null) {
x = 0;
} else {
x = l1.val;
}
if (l2 == null) {
y = 0;
} else {
y = l2.val;
}
int sum = x + y + tmp;
tmp = sum / 10;
cur.next= new ListNode(sum % 10);
cur = cur.next;
if (l1 != null) {
l1 = l1.next;
}
if (l2 != null) {
l2 = l2.next;
}
}
if (tmp > 0) {
cur.next = new ListNode(tmp);
}
return NewHead.next;
}
题目解析
这道题目看似简单易懂,但是并不是那么容易解决的,关键的难点就在于“进1”,如何将超过10的“1”保存下来。解决了这个问题,那么问题就解决一半了。我们先跳出链表,用{2,4,3}和{5,6,4}举例:
我们先创建一个整数tmp,初始值为0(tmp=0);用sum接收数字2和5和tmp的值之和,(sum=2+5+tmp),sum为7。接下来我们用tmp接收保存sum/10的值(tmp=sum/10),结果还是0。这时候我们新的数组的第一个元素就是sum%10(因为数值大小不能超过10),结果为7。接着继续用sum接收数字4和6和tmp的值之和,sum为10。我们用tmp接收保存sum/10的值,tmp结果为1。这时候我们数组的第二个元素的值就是sum%10,结果为0。最后用sum接收数字3和4和tmp的值之和,tmp此时为1,所以sum结果为8。再用tmp接收保存sum/10的结果,tmp为0。这时我们第三个元素的值为sum%10,结果为8。所以最后的数组为{7,0,8}。数组的问题解决,那么我们只需要将数组的结构上升成单链表,我们就可以解决问题,大体的思路是一样的。
首先实例化两个节点NewHead作为新链表中的头节点,cur作为遍历节点,当l1和l2不都为null,用x和y分别接收l1和l2的val值,如果有一个链表为null,那么它的val值为0。按照上述的算法完成第一个新链表的节点的val值的确定,然后实例化一个这个节点,并连接在头节点上(cur.next= new ListNode(sum % 10);)
然后在l1和l2不为null的条件下l1往后移动一个节点,l2往后移动一个节点,cur也往后移动一个节点。重复循环下去,直到l1和l2都为null,跳出循环,此时过程并没有结束,因为l1链表和l2链表最后一次val值相加,可能会导致“进1”,也就是说可以需要在创建一个节点来接收数字“1”,因此我们需要进行判断,tmp是否大于0,如果大于0,再创建一个节点保存“tmp”的val值。最后返回NewHead.next,问题解决。
好了,这次的每日一题就结束了,这道题目相对来说是比较难的,只要能看懂,多做几遍感觉上来也是一种进步,希望此次的博客能够给你带来帮助,谢谢各位的点赞,最后附上题目链接:
附:LeetCode2题——两数相加