每日一题(3)——数据结构(LeetCode)

每日一题(3)——数据结构(LeetCode)

题目

给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储 一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。
示例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题——两数相加

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Solitudefire

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值