leetcode-2 Add Two Numbers(两数相加)

2023-11-14

题目描述

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

思路

这题的难点在于需要处理进位,如果两个链表长度不一致,出现最高位的进位时,处理起来比较棘手。

因此,我们可以将两个链表视为长度一致,那么当同时遍历两条链表时,短的一条会出现空节点,此时我们给它进行“补0”即可。既解决了长度问题,右不影响数字相加的结果。

当前位计算的同时需要考虑上一位的进位,而当前位计算结束后同样需要更新进位值。

两个链表全部遍历完毕后,进位值为 1,则在新链表最后添加一个值位1的节点。

代码

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
    	// 链表构造过程需要指针移动,因此需要一个预先节点来返回链表
        ListNode pre = new ListNode(0);
        ListNode cur = pre;
        int carry = 0;
        while(l1 != null || l2 != null) {
        	// 短的链表补0
            int x = l1 == null ? 0 : l1.val;
            int y = l2 == null ? 0 : l2.val;
            int sum = x + y + carry;
            
            // 进位
            carry = sum / 10;
            sum = sum % 10;
            cur.next = new ListNode(sum);

            cur = cur.next;
            if(l1 != null)
                l1 = l1.next;
            if(l2 != null)
                l2 = l2.next;
        }
        // 如果两个链表全部遍历完毕后,进位值为 1,则在新链表最后添加节点1
        if(carry == 1) {
            cur.next = new ListNode(carry);
        }
        return pre.next;
    }
}

执行用时:2 ms, 在所有 Java 提交中击败了99.85%的用户
内存消耗:40.1 MB, 在所有 Java 提交中击败了93.78%的用户

优化一下使得代码更精简:

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
    	// 链表构造过程需要指针移动,因此需要一个预先节点来返回链表
        ListNode pre = new ListNode(0);
        ListNode cur = pre;
        int carry = 0;
        while(l1 != null || l2 != null || carry > 0) {
        	int sum = carry;
        	// 短的链表补0
            sum += l1 == null ? 0 : l1.val;
            sum += l2 == null ? 0 : l2.val;
            
            cur.next = new ListNode(sum % 10);

            cur = cur.next;
            if(l1 != null)
                l1 = l1.next;
            if(l2 != null)
                l2 = l2.next;

            // 进位
            carry = sum / 10;
        }

        return pre.next;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

leetcode-2 Add Two Numbers(两数相加) 的相关文章

随机推荐

  • uniapp体验如何?uniapp开发感受及优缺点分析

    很多开发者在没有入坑uniapp之前 都想知道uniapp的体验到底怎么样 开发爽不爽 优缺点是怎么样的 坑多不多 今天就以我个人开发的项目来谈一谈 首先介绍一下我在公司开发的项目 购靓号APP 也有h5 购靓号小程序 扫描下方二维码可以快
  • 华为OD机试 - 矩形相交的面积 - 逻辑分析(Java 2023 B卷 100分)

    目录 专栏导读 一 题目描述 二 输入描述 三 输出描述 1 输入 2 输出 3 说明 四 解题思路 五 Java算法源码 六 效果展示 1 输入 2 输出 3 说明 华为OD机试 2023B卷题库疯狂收录中 刷题点这里 专栏导读 本专栏收
  • 在HTML页面加载完毕后运行某个js.

    js方法 以下为jQuery方法 需要引用jQuery文件 或者其简写 function
  • CSDN删除、修改分类标签

    点击头像 进入 管理博客 点击个人分类管理 就可以修改分类标签 备注 删除标签后 该标签下的文章还在 不会丢失
  • LeetCode Number Complement

    class Solution public int findComplement int num int temp i 1 j temp num while temp 0 temp 2 i 2 j i 1 num return j temp
  • 部分选主元matlab,列选主元的高斯消去法-matlab

    大家对高斯消去法应该比较了解了 高代和线性代数中做的已经不少了 但是计算机实现的时候还是要注意一些东西 列选主元的高斯消去法 function X lufact my A B Inpiut A 是系数矩阵 B是右端项 Output x是解
  • 三层网络结构(核心层、汇聚层 、接入层)

    三层网络架构设计的网络有三个层次 核心层 网络的高速交换 汇聚层 提供基于策略的连接 接入层 将工作站接入网络 核心层 在核心层应该采用高带宽的交换机 核心层的设备采用双机冗余热备份是非常必要的 也可以使用负载均衡功能来改善网络性能 对于网
  • 软件测试复习(5)----基本路径测试中的细节

    在做基本路径测试的题中又有了新的发现 希望大家可以注意 另外 如果你是第一次看 可以先看一下我之前讲的基本路径方法的步骤 先看一下题目 我们不讲如何做这道题 只是讲一下我通过这道题关于知识点新的理解 题目 答案 知识点 细节 逻辑与 逻辑或
  • 雪崩击穿/齐纳击穿

    雪崩击穿 发生在掺杂浓度较低 自由电子冲撞价离子 温度越高 雪崩击穿需要的击穿电压越高 齐纳击穿 发生在掺杂浓度比较高的时候 自由电子直接跳出共价键 温度越高 齐纳击穿需要的击穿电压越低
  • 适用于小白-vs2019的下载与安装

    学习c语言时 少不了编译器的使用 那么传统的dev c 过于古老的同时 也不再更新 而大学授课老师一般要求安装vc 6 0 学校机房也一般为vc 6 0 但这两种都还是过于古老 现在机构授课过程一般采用vs2019 使用起来更加便捷 清晰
  • 将CelebA数据集所给标签转化为MTCNN中训练集所需标签

    img dir r D datasets CelebA Img img celeba 7z img celeba anno src r D datasets CelebA Anno list bbox celeba txt anno lan
  • Oracle数据库索引管理-基于函数索引ORA-30553

    在ORACALE数据库中 创建函数索引时 若函数是自定义的函数 须在定义函数时加上deterministic关健字 不然会出现 函数不确定 的错误提示 创建函数索引 ORA 30553 函数不确定 原函数如下 create or repla
  • Hibernate HQL绑定变量

    Hibernate HQL查询 插入 更新 update 实例 1 实体查询 有关实体查询技术 其实我们在先前已经有多次涉及 比如下面的例子 String hql from User user List list session Creat
  • 毕业设计 - 个人博客系统的设计与实现【源码+论文】

    文章目录 前言 一 项目设计 1 模块设计 博主功能用例 游客功能用例 2 实现效果 二 部分源码 项目源码 前言 今天学长向大家分享一个 Java web 毕业设计 项目 个人博客系统的设计与实现 一 项目设计 1 模块设计 博主功能用例
  • Linux驱动_多点电容触摸

    一丶Linux下多点电容触摸驱动框架 电容触摸屏IC是FT5426 为IIC协议芯片 因此需要编写IIC驱动 触摸IC会发出中断信号 并在中断服务函数中上报信息 因此需要编写中断框架 触摸屏向Linux内核上报的信息都属于Input子系统
  • 基于Unity3d 引擎的Android游戏优化

    最近项目进入收尾阶段 之前对项目做了很多优化 mesh合并 减少DrawCall和模型骨骼以及物理计算 合并材质球 优化代码等等 在IOS上还好 但是Android上 试过几款手机 从低端到高端 发现性能还是很差 所以又花了几天来研究摸索
  • C#中索引器

    C 中索引器和数组的使用类似 public class Test private readonly string name new string 10 public string this int index get return name
  • 【论文速览】根据人脑fMRI信号重建图像 Image Reconstruction from human brain activity

    文章目录 前言 文章一 研究背景 主要方法 部分实验结果 总结与思考 参考资料 文章二 研究背景 主要方法 部分实验结果 总结与思考 前言 人类的视觉神经系统对于真实世界的视觉刺激有着非凡的感知与理解能力 比如我们能够准确地识别物体距离和三
  • (java 基础知识) Java 安全套接字--javax.net.ssl

    有关SSL的原理和介绍在网上已经有不少 对于Java下使用keytool生成证书 配置SSL通信的教程也非常多 但如果我们不能够亲自动手做一个SSL Sever和SSL Client 可能就永远也不能深入地理解Java环境下 SSL的通信是
  • leetcode-2 Add Two Numbers(两数相加)

    题目描述 给出两个 非空 的链表用来表示两个非负的整数 其中 它们各自的位数是按照 逆序 的方式存储的 并且它们的每个节点只能存储 一位 数字 如果 我们将这两个数相加起来 则会返回一个新的链表来表示它们的和 您可以假设除了数字 0 之外