题目内容
实现一个叫addTwoNumbers的方法,它接受两个链表,每个链表代表一个非负整数。
链表的每个节点包含一个数字位,数字位按照逆序存储,也就是个位在链表的头部。
你需要将这两个数字相加,并将结果以相同的格式表示为链表。
注意
1. 链表节点数在[1,100]
2. 每一个节点值在[0,9]
3. 每一个链表都不会有前导0
单向链表节点预定义
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)
{
//在这里完成我们的代码
}
}
示例
输入: l1 = [2,4,3], l2 = [5,6,4]
输出: [7,0,8]
解释: 342 + 465 = 807。
解题思路
其实链表对我来说并不熟悉,对于更早接触C的我首先想到了数组,我马上自己新写了一个方法,传入数组相加,这样即使最差的情况下,我也可以强行把链表转换成数组。
很快 一种简单粗暴的方法被我写出来了,我会把循环执行到l1和l2数组中更长的那一个,如果较短长度的数组被循环完,则我们只需考虑长数组和进位情况即可。同时我用flag来进行进位判断。最后返回l3就是我们所需要的结果。代码如下
public static int[] addTwoNumbers(int[] l1, int[] l2)
{
int max = Math.max(l1.length, l2.length);
int min = Math.min(l1.length, l2.length);
int[] l3 = new int[max + 1];
boolean flag = false;
for (int i = 0; i < min; ++i)
{
l3[i] = (l1[i] + l2[i] + (flag ? 1 : 0 )) % 10;
flag = l1[i] + l2[i] + (flag ? 1 : 0) >= 10;
for (int j = min; j < max; ++j)
{
int sum = (l1.length > l2.length ? l1[j] : l2[j]);
l3[j] = (sum + (flag ? 1 : 0)) % 10;
flag = sum + (flag ? 1 : 0) >= 10;
}
if (flag) l3[max] = 1;
}
return l3;
}
在无路可走的情况下,转换成数组暴力解决不失为一种方法,但给了我们链表,我们应该学会它的使用方法 。
你可以不开,但不能没有。——某CS:GO玩家
观察题目可知传入方法的是链表的节点而不是链表,所以我们不需要使用迭代器,只要用循环就可以解决问题,这一点和数组很像。与数组很像的还有一点是我们也需要创建一个新的链表来表示返回结果。**不同点在于链表需要一个虚拟的头节点来支持循环的进行,特别注意在我们返回结果时需要返回的是头节点的下一个节点!!!**以及我们不需要过多的循环,只需要把null的节点替换成0就可以进行运算。以下是代码
public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode dummyHead = new ListNode(0);
ListNode result = dummyHead;
int carry = 0;
while (l1 != null || l2 != null || carry != 0)
{
int sum = (l1 != null ? l1.val : 0) + (l2 != null ? l2.val : 0) + carry;
carry = sum / 10;
result.next = new ListNode(sum % 10);
result = result.next;
if (l1 != null) l1 = l1.next;
if (l2 != null) l2 = l2.next;
}
return dummyHead.next;
}
运行结果;
耗时:1毫秒 击败100.00% 的Java用户
空间占用: 42.96MB 击败88.97%的Java用户
希望这篇文章可以给大家带来帮助!