LeetCode 第2题:两数相加

news/2025/2/7 22:01:46/文章来源:https://www.cnblogs.com/lavender-vv/p/18703363

LeetCode 第2题:两数相加

题目描述

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

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

难度

中等

题目链接

https://leetcode.cn/problems/add-two-numbers/

示例

示例 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]

提示

  • 每个链表中的节点数在范围 [1, 100] 内
  • 0 <= Node.val <= 9
  • 题目数据保证列表表示的数字不含前导零

解题思路

方法:模拟加法运算

这道题本质上是在模拟我们小学学习的加法运算过程,只是在链表中进行。

关键点:

  1. 链表是逆序存储的,即最低位在链表头部,这正好符合我们从低位到高位的加法运算顺序
  2. 需要处理进位(carry)情况
  3. 注意链表长度不同的情况
  4. 最后还要检查是否有进位需要增加新节点

具体步骤:

  1. 创建一个虚拟头节点(dummy node),简化插入操作
  2. 同时遍历两个链表,模拟加法运算:
    • 获取当前两个节点的值(如果节点为空则值为0)
    • 计算和(需要加上上一步的进位)
    • 创建新节点存储个位数
    • 更新进位值
  3. 遍历结束后,检查是否还有进位,如有则添加新节点
  4. 返回虚拟头节点的下一个节点

时间复杂度:O(max(m,n)),其中 m 和 n 分别为两个链表的长度
空间复杂度:O(max(m,n)),需要创建一个新链表

代码实现

C# 实现

/*** Definition for singly-linked list.* public class ListNode {*     public int val;*     public ListNode next;*     public ListNode(int val=0, ListNode next=null) {*         this.val = val;*         this.next = next;*     }* }*/
public class Solution {public ListNode AddTwoNumbers(ListNode l1, ListNode l2) {// 创建虚拟头节点ListNode dummy = new ListNode(0);ListNode current = dummy;int carry = 0; // 进位值// 当两个链表都没有遍历完,或者还有进位时继续循环while (l1 != null || l2 != null || carry > 0) {// 获取当前节点的值,如果节点为空则值为0int x = l1 != null ? l1.val : 0;int y = l2 != null ? l2.val : 0;// 计算和与进位int sum = x + y + carry;carry = sum / 10;// 创建新节点current.next = new ListNode(sum % 10);current = current.next;// 移动指针l1 = l1?.next;l2 = l2?.next;}return dummy.next;}
}

代码详解

  1. ListNode dummy = new ListNode(0):创建虚拟头节点,简化链表操作
  2. while (l1 != null || l2 != null || carry > 0)
    • 只要还有节点未处理或者还有进位,就继续循环
  3. int x = l1 != null ? l1.val : 0
    • 如果l1节点存在,获取其值;否则用0代替
  4. sum = x + y + carry
    • 计算当前位的和,包含上一位的进位
  5. carry = sum / 10
    • 计算新的进位值
  6. current.next = new ListNode(sum % 10)
    • 创建新节点,存储个位数
  7. l1 = l1?.next
    • 使用空条件运算符安全地移动指针

执行结果

  • 执行用时:92 ms
  • 内存消耗:48.4 MB

总结与反思

  1. 这是一道经典的链表操作题目,考察了:
    • 链表的基本操作
    • 进位处理
    • 边界条件的处理
  2. 使用虚拟头节点(dummy node)是简化链表操作的常用技巧
  3. 代码中使用了C#的空条件运算符(?.),使代码更简洁安全
  4. 关键是要考虑到:
    • 两个链表长度可能不同
    • 最后可能还有进位需要处理
    • 不要忘记释放虚拟头节点

相关题目

  • LeetCode 第445题:两数相加 II
  • LeetCode 第43题:字符串相乘
  • LeetCode 第66题:加一
  • LeetCode 第369题:给单链表加一

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/880249.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Tita 项目管理:前后置业务流程的得力助手

在当今竞争激烈的商业环境中,高效的项目管理对于企业的成功至关重要。而项目前后置业务流程的顺畅运作,更是决定项目成败的关键因素。接下来,让我们一起看看项目前后置业务流程的常见应用场景,以及 Tita 项目管理产品如何发挥重要作用。 项目启动前:精准规划,奠定成功基础…

P3405 [USACO16DEC] Cities and States S(哈希算法)

总的来说这是一道简单的哈希算法,由于是字符串,所以哈希编码时只用乘26就行了

虚拟化技术介绍

一、虚拟化技术简介 虚拟化(Virtualization)的含义很广泛。将任何一种形式的资源抽象成另一种形式的技术都是虚拟化,是资源的一种逻辑表示。解除了物理硬件和操作系统之间的紧耦合关系。虚拟化是云计算的基础。简单地说,虚拟化使得在一台物理的服务器上可以跑多台虚拟机,虚…

地平线 3D 目标检测 Bevformer 参考算法 V2.0

该示例为参考算法,仅作为在 征程 6 上模型部署的设计参考,非量产算法 简介 BEVFormer 是当前热门的自动驾驶系统中的 3D 视觉感知任务模型。BEVFormer 是一个端到端的框架,BEVFormer 可以直接从原始图像数据生成 BEV 特征,无需依赖于传统的图像处理流程。它通过利用 Transf…

.NET周刊【1月第3期 2025-01-19】

国内文章 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(一):从.NET IoT入门开始 https://www.cnblogs.com/GreenShade/p/18667671 文章介绍了一款基于树莓派Zero 2W和.NET技术的智能桌面机器人。作者因对该项目的兴趣与网友需求而进行开发。产品结…

AUTOSAR 学习笔记

AUTOSAR 学习笔记 概述 ​ 本文章为0基础小白记录AUTOSAR学习笔记。如有错误,欢迎评论区指正。个人笔记模式习惯采用提问式记录,也是这篇文章的主要记录模式。 补充,大篇幅文章推荐: 《AutoSAR入门到精通系列讲解》作者:雪云飞星 https://blog.csdn.net/xyfx_fhw/category…

Win11环境下安装Oracle Databases 11g 遇到[INS-13001]环境不满足最低要求解决办法

找到你解压后的文件,点击打开database文件夹 -->stage文件夹 -->cvu文件夹 -->cvu_prereq.xml文件,用记事本打开cvu_prereq.xml文件; 在这个<CERTIFIED_SYSTEMS>。。。</CERTIFIED_SYSTEMS>语句之间增加如下代码: ...... <CERTIFIED_SYSTEMS> &…

Zookeeper入门api与应用

一、 说明 Zookeeper作为一个分布式的服务框架,主要用来解决分布式集群中应用系统的一致性问题,它能提供基于类似于文件系统的目录节点树方式的数据存储,但是 Zookeeper并不是用来专门存储数据的,它的作用主要是用来维护和监控你存储的数据的状态变化。通过监控这些数据状态…

马走日(结论题)

这道题本质上,是一道结论题,结论如下: 1.小尺寸处理: 如果点阵的行或列有一个为1,则马无法移动,只能留在起点,此时答案为1。 如果点阵的最小边为2,则马只能沿着较长的边移动,每次移动步长为2,此时答案为较长边的一半加1。 2.中等尺寸处理: 当点阵为3x3时,马无法到达…

[lnsyoj1158] 淘淘蓝蓝之幻影树

dp题意sol 若某一方胜利,则设该方战胜的区间为 \([l_i,r_i]\),那么过程可描述为 \(1\) 打败 \([l_1,r_1]\),\(2\) 打败 \(l_2,r_2\)…………\(k\) 打败 \([l_k,r_k]\)。显然,\(k\) 打败 \([l_k,r_k]\)…………\(2\) 打败 \(l_2,r_2\),\(1\) 打败 \([l_1,r_1]\) 与之等价,…

NAS——强化学习结合CNN

一. 子模型的基本架构子模型由N个卷积单元和M个缩减单元按一定规则排列后加上GAP层、FC层和Softmax层组成。关键:通过引入卷积单元和缩减单元,充分发挥了CNN模型强大的特征提取能力。 整个结构中后面三层是确定的,中间的卷积单元和缩减单元要从搜索空间中获取。 二. 搜索空间…

Learn Learn Go Reverse

根据做题学习 [i春秋ezgo]Go栈扩容的逻辑,这里无需关注。具体汇编代码输入函数与输出函数系统学习go reverse 参考文章: https://forum.butian.net/share/1874 Go基础 见 https://forum.butian.net/share/1874 查看Go版本 //一、查看版本号 go version xx.exe //二、查看地址以…