LeetCode 2 - 两数相加

LeetCode 2 - 两数相加 是一道经典链表操作问题,经常作为面试中基础题的变体被考察。掌握多种解法及其变体,并熟悉其核心思路和模板代码,可以快速备战相关链表或大数计算问题。


题目描述

给定两个非空链表,它们代表两个非负整数,每个节点保存一个数字,数字按 逆序存储(个位在链表头部),求两个数的和并返回一个新的链表,表示其逆序和。

  • 输入:两个链表,l1 表示整数 a,l2 表示整数 b。
  • 输出:表示结果 a + b 的链表。

示例:

输入: l1 = [2,4,3], l2 = [5,6,4]
输出: [7,0,8]
解释: 342 + 465 = 807

解法及其分析

解法 1:模拟加法(逐位相加)

思路
  • 链表表示逆序存储的数字,相当于按从低位到高位逐位对齐相加,因此直接模拟两数加法过程:
    1. 遍历两个链表,从头到尾逐位相加,考虑进位。
    2. carry 表示当前进位值(初始为 0)。
    3. 若链表长度不相等,可补 0,即看成空位处理。
    4. 将每次相加后的结果(sum % 10)保存到新链表中。
  • 完成遍历后,如果 carry 不为 0,则需要在结果链表末尾补 1。
模板代码
class Solution {public ListNode addTwoNumbers(ListNode l1, ListNode l2) {ListNode dummyHead = new ListNode(0); // 哑节点ListNode p1 = l1, p2 = l2, current = dummyHead;int carry = 0;// 遍历两个链表while (p1 != null || p2 != null) {int x = (p1 != null) ? p1.val : 0; // 当节点为空时看作 0int y = (p2 != null) ? p2.val : 0;int sum = x + y + carry; // 当前位和carry = sum / 10;       // 计算进位current.next = new ListNode(sum % 10); // 新节点保存当前位值current = current.next;// 前进指针if (p1 != null) p1 = p1.next;if (p2 != null) p2 = p2.next;}// 如果最后进位不为 0,添加额外节点if (carry > 0) {current.next = new ListNode(carry);}return dummyHead.next; // 返回去掉哑节点后的结果链表}
}
复杂度分析
  • 时间复杂度: O(max(m, n)),其中 mn 是两个链表的长度,需遍历长链表的每个节点。
  • 空间复杂度: O(1),除了结果链表外,没有使用额外空间。

解法 2:递归解法

思路
  • 使用递归模拟逐位相加的过程:
    • 每次处理一对链表节点,计算当前位的和以及进位。
    • 递归调用处理剩余链表部分,进位值通过函数参数传递。
  • 递归本质就是逆序链表的“从尾到头”的回溯计算。
模板代码
class Solution {public ListNode addTwoNumbers(ListNode l1, ListNode l2) {return helper(l1, l2, 0);}private ListNode helper(ListNode l1, ListNode l2, int carry) {if (l1 == null && l2 == null && carry == 0) {return null; // 递归结束条件}int sum = carry;if (l1 != null) sum += l1.val;if (l2 != null) sum += l2.val;ListNode node = new ListNode(sum % 10); // 保存当前位node.next = helper((l1 != null) ? l1.next : null, (l2 != null) ? l2.next : null, sum / 10 // 进位传递到下一层递归);return node;}
}
复杂度分析
  • 时间复杂度: O(max(m, n)),需要递归处理每一位。
  • 空间复杂度: O(max(m, n)),递归调用栈的深度最大为链表长度。

解法 3:反转链表法(适用于顺序存储时)

核心问题

如果链表存储的是整数的正常顺序(高位在前),如何求两数和?

思路
  1. 若链表采用正序存储,则需要先将链表反转(采用常用 反转链表模板)。
  2. 使用解法 1 的逐位相加方法,计算链表和。
  3. 最后将结果链表反转,恢复顺序。
模板代码
class Solution {public ListNode addTwoNumbers(ListNode l1, ListNode l2) {l1 = reverseList(l1);l2 = reverseList(l2);ListNode result = addTwoNumbersReversed(l1, l2);return reverseList(result);}// 反转链表private ListNode reverseList(ListNode head) {ListNode prev = null;while (head != null) {ListNode next = head.next;head.next = prev;prev = head;head = next;}return prev;}// 借助解法1,计算反转链表的和private ListNode addTwoNumbersReversed(ListNode l1, ListNode l2) {ListNode dummyHead = new ListNode(0);ListNode current = dummyHead;int carry = 0;while (l1 != null || l2 != null || carry != 0) {int x = (l1 != null) ? l1.val : 0;int y = (l2 != null) ? l2.val : 0;int sum = x + y + carry;current.next = new ListNode(sum % 10);carry = sum / 10;current = current.next;if (l1 != null) l1 = l1.next;if (l2 != null) l2 = l2.next;}return dummyHead.next;}
}
复杂度分析
  • 时间复杂度: O(m + n),反转链表和加法操作总共需要线性时间。
  • 空间复杂度: O(1),原地操作链表。

变体问题

1. 链表与整数数组转换
  • 将链表转换为整数数组,再处理运算,最后将结果转换回链表。
  • 对于大整数字符串输入,也可以使用类似思路。
2. 两个数字是否相等
  • 判断两个链表存储的整数是否相等。
3. 合并 k 个链表的和
  • 扩展为 k 个链表相加,这可以使用优先队列或逐链表合并。
4. 大数相加(整数以字符串形式存储)
  • 给定两个数字以字符串形式存储,模拟大数加法逻辑。
  • 和这道题的链表加法思路非常类似。
5. 减法模拟
  • 如果要求两个链表表示的数相减,稍作修改:
    • 按位模拟减法。
    • 借位处理时,考虑前一位减 1。

快速 AC 总结

  1. 熟记关键模块
    • 使用链表构造哑节点(dummyHead)。
    • 逐位相加时的循环结构与边界条件。
    • 进位处理逻辑(如 carry)。
  2. 应对变体问题
    • 若逆序时直接逐位相加,正序时先反转链表。
    • 若输入为整数数组或大数字符串,则手动模拟链表结构。
  3. 调试基础功能(链表遍历、构建和反转)
    • 熟悉链表的单步操作和空链表边界处理,无论变体或难度增加都可以高效应对。

通过练习核心模板和理解变体模式,可以轻松解决这类链表和数字计算相关的题目。

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

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

相关文章

Qt之QStateMachine等待

在项目中经常需要等待,我们模拟0-30的数,假如我们其中5, 25的数需要进行等待,等待用户处理完自己事情后,按下按钮继续,找Qt的项目中有一个 QStateMachineqstatemmachine类提供了一个分层有限状态机。 QSta…

elpis全栈课程学习之elpis-core学习总结

elpis全栈课程学习之elpis-core学习总结 核心原理 elpis-core是全栈框架elpis的服务端内核,主要应用于服务端接口的开发以及页面的SSR渲染,elpis-core基于约定优于配置的原理,通过一系列的loader来加载对应的文件,大大节约用户的…

ChatGPT与DeepSeek:开源与闭源的AI模型之争

目录 一、模型架构与技术原理 二、性能能力与应用场景 三、用户体验与部署灵活性 四、成本与商业模式 五、未来展望与市场影响 六、总结 随着人工智能技术的飞速发展,ChatGPT和DeepSeek作为两大领先的AI语言模型,成为了行业内外关注的焦点。它们在…

在笔记本电脑上用DeepSeek搭建个人知识库

最近DeepSeek爆火,试用DeepSeek的企业和个人越来越多。最常见的应用场景就是知识库和知识问答。所以本人也试用了一下,在笔记本电脑上部署DeepSeek并使用开源工具搭建一套知识库,实现完全在本地环境下使用本地文档搭建个人知识库。操作过程共…

DeepSeek蒸馏TinyLSTM实操指南

一、硬件准备 阶段推荐配置最低要求训练阶段NVIDIA A100 80GB 4RTX 3090 24GB 1量化阶段Intel Xeon Gold 6248R CPUi7-12700K + 64GB RAM部署阶段Jetson Xavier NX开发套件Raspberry Pi 4B 8GB二、软件环境搭建 # 创建Python虚拟环境 conda create -n distil python=3.9 conda…

Linux ls 命令

Linux ls(英文全拼: list directory contents)命令用于显示指定工作目录下之内容(列出目前工作目录所含的文件及子目录)。 语法 ls [-alrtAFR] [name...] 参数 : -a 显示所有文件及目录 (. 开头的隐藏文件也会列出)-d 只列出目…

LeetCode 热题 100 53. 最大子数组和

LeetCode 热题 100 | 53. 最大子数组和 大家好,今天我们来解决一道经典的算法题——最大子数组和。这道题在 LeetCode 上被标记为中等难度,要求我们找出一个具有最大和的连续子数组,并返回其最大和。下面我将详细讲解解题思路,并…

【计算机网络入门】初学计算机网络(九)

目录 1.令牌传递协议 2. 局域网&IEEE802 2.1 局域网基本概念和体系结构 3. 以太网&IEEE802.3 3.1 MAC层标准 3.1.1 以太网V2标准 ​编辑 3.2 单播广播 3.3 冲突域广播域 4. 虚拟局域网VLAN 1.令牌传递协议 先回顾一下令牌环网技术,多个主机形成…

Java 大视界 -- Java 大数据中的时间序列数据异常检测算法对比与实践(103)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…

Android Activity栈关系解析

在 Android 系统中,这些类共同构成了 Activity 任务栈管理的核心架构。它们的关系可以类比为一栋大楼的管理体系,每个类负责不同层级的任务。以下是它们的详细解释和实际场景示例: 1. ActivityRecord(活动记录) 是什么…

【0011】HTML其他文本格式化标签详解(em标签、strong标签、b标签、i标签、sup标签、sub标签......)

如果你觉得我的文章写的不错&#xff0c;请关注我哟&#xff0c;请点赞、评论&#xff0c;收藏此文章&#xff0c;谢谢&#xff01; 本文内容体系结构如下&#xff1a; 本文旨在深入探讨HTML中其他的文本格式化标签&#xff0c;主要有<em> 标签、<strong> 标签、…

华为AP 4050DN-HD的FIT AP模式改为FAT AP,家用FAT基本配置

在某鱼买了两台华为AP 4050DN-HD , AP是二手的 , 在AC上上过线 , 所以就不能开机自选为FIP模式了 我没有AC无线控制器 , 就是买一个自己玩 , AP又是FIT瘦AP模式 ,所以我就想把AP的瘦AP模式改为FAT胖AP模式 1. 准备工作 1.1下载好对应软件&#xff0c;进入到 企业业务网站去下…

【Linux网络-HTTP协议】HTTP基础概念+构建HTTP

代码定位&#xff1a;南毅c/Linux - Gitee.com HTTP协议 介绍 虽然我们说&#xff0c;应用层协议是我们程序猿自己定的.但实际上,已经有大佬们定义了一些现成的,又非常好用的应用层协议,供我们直接参考使用。HTTP(超文本传输协议)就是其中之一。 在互联网世界中&#xff0c…

SpringSecurity 实现token 认证

配置类 Configuration EnableWebSecurity EnableGlobalMethodSecurity(prePostEnabledtrue) public class SpringSecurityConfig extends WebSecurityConfigurerAdapter { Bean Override public AuthenticationManager authenticationManagerBean() throws Exception {return s…

基于互联网协议的诊断通信(DoIP)

1、ISO 13400标准和其他汽车网络协议标准有何不同&#xff1f; ISO 13400 标准即 DoIP 协议标准&#xff0c;与其他常见汽车网络协议标准&#xff08;如 CAN、LIN、FlexRay 等&#xff09;有以下不同&#xff1a; 通信基础与适用场景 ISO 13400&#xff1a;基于互联网协议&a…

LabVIEW DataSocket 通信库详解

dataskt.llb 是 LabVIEW 2019 内置的核心函数库之一&#xff0c;位于 vi.lib\Platform\ 目录下&#xff0c;专注于 DataSocket 技术的实现。DataSocket 是 NI 提供的网络通信协议&#xff0c;支持跨平台、跨设备的实时数据共享&#xff0c;广泛应用于远程监控、分布式系统集成等…

Android 端侧运行 LLM 框架 MNN 及其应用

MNN Chat Android App - 基于 MNN 引擎的智能聊天应用 一、MNN 框架简介与工作原理1.1 什么是 MNN&#xff1f;1.2 MNN 的工作原理 二、MNN Chat Android App2.1 MNN Chat 的功能2.2 MNN Chat 的优势2.3 MNN Chat Android App 的使用 三、总结 随着移动端人工智能需求的日益增长…

ARM Linux LCD上实时预览摄像头画面

文章目录 1、前言2、环境介绍3、步骤4、应用程序编写4.1、lcd初始化4.2、摄像头初始化4.3、jpeg解码4.4、开启摄像头4.5、完整的程序如下 5、测试5.1、编译应用程序5.2、运行应用程序 6、总结 1、前言 本次应用程序主要针对支持MJPEG格式输出的UVC摄像头。 2、环境介绍 rk35…

[代码规范]接口设计规范

一个优雅的接口要如何设计&#xff1f;有哪些设计规范可以遵循&#xff1f; 下面抛砖引玉&#xff0c;分享一些规范。 目录 1、RESTful API 设计最佳实践 2、Shneiderman 的 8 条黄金法则 3、Nielsen 的 10 条启发式规则 1、RESTful API 设计最佳实践 一共18条&#xff0c;参考…

如何在Python用Plot画出一个简单的机器人模型

如何在Python中使用 Plot 画出一个简单的模型 在下面的程序中&#xff0c;首先要知道机器人的DH参数&#xff0c;然后计算出每一个关节的位置&#xff0c;最后利用 plot 函数画出关节之间的连杆就可以了&#xff0c;最后利用 animation 库来实现一个动画效果。 import matplo…