LeetCode-2 两数相加(Java实现)
题目如下:
已经给定的链表类如下:
我的解决思路
1、先定义一个num1来存放l1的实际十进制值,num2来存放l1的实际十进制值。
int num1 = 0;
int i = 0;
do{
num1 = num1 + (int)(l1.val * Math.pow(10,i));
i++;
l1 = l1.next;
}while(l1 != null);
2、计算num1+num2的和的长度len,创建一个长度为len的ListNode数组,并初始化。
注意: new ListNode[len]创建出来的是len个空ListNode对象,必须初始化对象才能用;对象只能在创建的时候初始化。
int sum = num1 + num2;
int len = (sum+"").length();
ListNode[] result = new ListNode[len];
for (int l =0 ; l < len ; l++){
// 不能直接result[l].val = 0;因为result[l]是空
result[l] = new ListNode(0);
}
for (int l =0 ; l < len -1 ; l++){
result[l].next = result[l+1];
}
3、将num1+num2的和通过 /10、%10的操作将结果拆成百位数、十位数、个位数…
for (int k = 0; k <len ; k++){
result[len-k-1].val = sum / (int)(Math.pow(10,len-k- 1));
sum =sum % (int)Math.pow(10,len-k- 1);
}
4、提交
测试的时候是没有问题的。
提交的时候就报错了,原因应该是10000000000超出了int的范围。。。,看来这种方法是不能使用的 ,必须另想办法(我的脑细胞 TAT )。
新的解决思路
不能直接相加,那就只能通过一位一位的加(突然想起了小学老师教我加法的场景),需要定义一个变量来保存是否需要进1,举个例子,先定义两个链表l1:(8 -> 5 -> 3)、l2:(4 -> 5 -> 1),定义一个flag保存是否进1。运算步骤如下:
- 第一位相加8+4=12,那么存到结果链表中的数据应该是2,下一个链表的数据应该+1
- 第二位相加5+5+1=11,那么存到结果链表中的数据应该是1,下一个链表的数据应该+1
- 第二位相加3+1+1=5,那么存到结果链表中的数据应该是5,下一个链表的数据应该+0
运算思路如上,不过实际运算中要考虑两个链表位数不一致,以及运算结果需要进1位的情况。
代码如下:
分享下踩得坑:
- 要判断两个链表其中一个为空了,另一个不为空的情况
- 两个都为空了,要看一下flag标记,比如 89 +12 的情况,l1、l2都已经取完了,但是flag == 1,所以还需要进一位。
- 为什么已经定义了result 还要定义current ?因为只定义一个result的话。result = result.next这样我们就丢失了结果链表的开头了,我们必须保存一份头节点。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode result = new ListNode(0);
ListNode current = result;
int flag = 0;
while(l1 != null || l2 != null){
if (l1 != null && l2 != null){
current.val = (l1.val + l2.val + flag) % 10;
flag = (l1.val + l2.val + flag) >= 10 ? 1 : 0;
l1 = l1.next;
l2 = l2.next;
}else if (l1 != null && l2 == null){
current.val = (l1.val + flag) % 10;
flag = (l1.val + flag) >= 10 ? 1 : 0;
l1 = l1.next;
}else if (l1 == null && l2 != null){
current.val = (l2.val + flag) % 10;
flag = (l2.val + flag) >= 10 ? 1 : 0;
l2 = l2.next;
}
if (l1 == null && l2 == null){
if (flag == 1){
current.next = new ListNode(1);
current = current.next;
}
return result;
}
current.next = new ListNode(0);
current = current.next;
}
return result;
}
}
提交,2ms还挺快的