LeetCode-2 两数相加(Java实现)

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。运算步骤如下:

  1. 第一位相加8+4=12,那么存到结果链表中的数据应该是2,下一个链表的数据应该+1
  2. 第二位相加5+5+1=11,那么存到结果链表中的数据应该是1,下一个链表的数据应该+1
  3. 第二位相加3+1+1=5,那么存到结果链表中的数据应该是5,下一个链表的数据应该+0

  运算思路如上,不过实际运算中要考虑两个链表位数不一致,以及运算结果需要进1位的情况。
  代码如下:
分享下踩得坑:

  1. 要判断两个链表其中一个为空了,另一个不为空的情况
  2. 两个都为空了,要看一下flag标记,比如 89 +12 的情况,l1、l2都已经取完了,但是flag == 1,所以还需要进一位。
  3. 为什么已经定义了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还挺快的
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值