LeetCode 热题100 2. 两数相加

news2025/2/25 15:35:02

LeetCode 热题100 | 2. 两数相加

大家好,今天我们来解决一道经典的算法题——两数相加。这道题在 LeetCode 上被标记为中等难度,要求我们将两个非空的链表表示的整数相加,并以相同形式返回一个表示和的链表。下面我将详细讲解解题思路,并附上 Python 代码实现。


题目描述

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

示例:

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

解题思路

这道题的核心是模拟两个数的加法过程。由于链表是逆序存储的,我们可以直接从链表的头部开始逐位相加,并处理进位。

核心思想
  1. 初始化

    • 创建一个虚拟头节点 dummy,用于简化链表操作。
    • 使用一个指针 current 指向当前节点。
    • 初始化进位 carry 为 0。
  2. 遍历链表

    • 遍历两个链表,逐位相加,并加上进位。
    • 计算当前位的值 sum_val 和新的进位 carry
    • 创建一个新节点,存储 sum_val % 10,并将其链接到结果链表中。
    • 移动指针 current 和链表指针 l1l2
  3. 处理剩余的进位

    • 如果遍历结束后仍有进位,创建一个新节点存储进位。
  4. 返回结果

    • 返回虚拟头节点的下一个节点,即结果链表的头节点。

代码实现

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

def addTwoNumbers(l1, l2):
    """
    :type l1: ListNode
    :type l2: ListNode
    :rtype: ListNode
    """
    dummy = ListNode()  # 虚拟头节点
    current = dummy  # 当前节点指针
    carry = 0  # 进位
    
    # 遍历两个链表
    while l1 or l2 or carry:
        # 计算当前位的值
        val1 = l1.val if l1 else 0
        val2 = l2.val if l2 else 0
        sum_val = val1 + val2 + carry
        carry = sum_val // 10  # 计算进位
        current.next = ListNode(sum_val % 10)  # 创建新节点
        current = current.next  # 移动指针
        
        # 移动链表指针
        if l1:
            l1 = l1.next
        if l2:
            l2 = l2.next
    
    return dummy.next  # 返回结果链表的头节点

代码解析

  1. 初始化

    • dummy 是虚拟头节点,用于简化链表操作。
    • current 指向当前节点,初始时指向 dummy
    • carry 是进位,初始为 0。
  2. 遍历链表

    • 使用 while 循环遍历两个链表,直到两个链表都遍历完且没有进位。
    • 计算当前位的值 sum_val 和新的进位 carry
    • 创建一个新节点,存储 sum_val % 10,并将其链接到结果链表中。
    • 移动指针 current 和链表指针 l1l2
  3. 处理剩余的进位

    • 如果遍历结束后仍有进位,创建一个新节点存储进位。
  4. 返回结果

    • 返回 dummy.next,即结果链表的头节点。

复杂度分析

  • 时间复杂度:O(max(m, n)),其中 m 和 n 分别是两个链表的长度。我们需要遍历两个链表的所有节点。
  • 空间复杂度:O(max(m, n)),结果链表的长度最多为 max(m, n) + 1。

示例运行

示例 1
# 创建链表 l1 = [2,4,3]
l1 = ListNode(2)
l1.next = ListNode(4)
l1.next.next = ListNode(3)

# 创建链表 l2 = [5,6,4]
l2 = ListNode(5)
l2.next = ListNode(6)
l2.next.next = ListNode(4)

# 计算两数相加
result = addTwoNumbers(l1, l2)

# 输出结果链表
while result:
    print(result.val, end=" -> ")
    result = result.next
print("None")

输出:

7 -> 0 -> 8 -> None
示例 2
# 创建链表 l1 = [0]
l1 = ListNode(0)

# 创建链表 l2 = [0]
l2 = ListNode(0)

# 计算两数相加
result = addTwoNumbers(l1, l2)

# 输出结果链表
while result:
    print(result.val, end=" -> ")
    result = result.next
print("None")

输出:

0 -> None
示例 3
# 创建链表 l1 = [9,9,9,9,9,9,9]
l1 = ListNode(9)
l1.next = ListNode(9)
l1.next.next = ListNode(9)
l1.next.next.next = ListNode(9)
l1.next.next.next.next = ListNode(9)
l1.next.next.next.next.next = ListNode(9)
l1.next.next.next.next.next.next = ListNode(9)

# 创建链表 l2 = [9,9,9,9]
l2 = ListNode(9)
l2.next = ListNode(9)
l2.next.next = ListNode(9)
l2.next.next.next = ListNode(9)

# 计算两数相加
result = addTwoNumbers(l1, l2)

# 输出结果链表
while result:
    print(result.val, end=" -> ")
    result = result.next
print("None")

输出:

8 -> 9 -> 9 -> 9 -> 0 -> 0 -> 0 -> 1 -> None

总结

通过模拟加法过程,我们可以高效地将两个链表表示的整数相加,并返回结果链表。这种方法的时间复杂度为 O(max(m, n)),空间复杂度为 O(max(m, n)),能够处理较大的输入规模。希望这篇题解对你有帮助!如果还有其他问题,欢迎继续提问!

关注我,获取更多算法题解和编程技巧!

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

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

相关文章

深度学习技术全景图:从基础架构到工业落地的超级进化指南

🔍 目录导航 基础架构革命训练优化秘技未来战场前瞻 🧩 一、基础架构革命 1.1 前馈神经网络(FNN) ▍核心结构 import torch.nn as nnclass FNN(nn.Module):def __init__(self):super().__init__()self.fc1 nn.Linear(784, 25…

PyTorch-基础(CUDA、Dataset、transforms、卷积神经网络、VGG16)

PyTorch-基础 环境准备 CUDA Toolkit安装(核显跳过此步骤) CUDA Toolkit是NVIDIA的开发工具,里面提供了各种工具、如编译器、调试器和库 首先通过NVIDIA控制面板查看本机显卡驱动对应的CUDA版本,如何去下载对应版本的Toolkit工…

IO/网络IO基础全览

目录 IO基础CPU与外设1. 程序控制IO(轮询)2. 中断中断相关知识中断分类中断处理过程中断隐指令 3. DMA(Direct Memory Access) 缓冲区用户空间和内核空间IO操作的拷贝概念传统IO操作的4次拷贝减少一个CPU拷贝的mmap内存映射文件(m…

【DeepSeek-R1背后的技术】系列十一:RAG原理介绍和本地部署(DeepSeekR1+RAGFlow构建个人知识库)

【DeepSeek-R1背后的技术】系列博文: 第1篇:混合专家模型(MoE) 第2篇:大模型知识蒸馏(Knowledge Distillation) 第3篇:强化学习(Reinforcement Learning, RL)…

鸿蒙开发深入浅出04(首页数据渲染、搜索、Stack样式堆叠、Grid布局、shadow阴影)

鸿蒙开发深入浅出04(首页数据渲染、搜索、Stack样式堆叠、Grid布局、shadow阴影) 1、效果展示2、ets/pages/Home.ets3、ets/views/Home/SearchBar.ets4、ets/views/Home/NavList.ets5、ets/views/Home/TileList.ets6、ets/views/Home/PlanList.ets7、后端…

【数据结构】B树家族详解:B树、B+树、B*

一、B树(B-Tree) 1. 定义 B树是一种平衡多路查找树,自平衡的树,能够保持数据有序,设计目标是为减少磁盘I/O次数。适用于需要频繁读写磁盘的场景(如数据库、文件系统)。 2、B树基本性质 节点键值数量限制: 对于 m 阶 B 树,根节点至少有 1 个键值,最多有 m - 1 个…

C语言数据结构—二叉树的链式结构实现

目录 1、建立二叉树 1.1 二叉树的结构 1.2 手动建立二叉树 2、二叉树的遍历 2.1 二叉树的三种遍历方式 2.1.1 前序遍历 2.1.2 中序遍历 2.1.2 后序遍历 3、求二叉树的结点数和二叉树的高度 3.1 求二叉树结点数 3.2 求二叉树叶子结点 3.3 求二叉树第k层结点的个数 …

Java 大视界 —— Java 大数据在智能零售动态定价策略中的应用实战(98)

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

危化品经营单位安全管理人员的职责及注意事项

危化品经营单位安全管理人员肩负着保障经营活动安全的重要责任,以下是其主要职责及注意事项: 职责 1. 安全制度建设与执行:负责组织制定本单位安全生产规章制度、操作规程和生产安全事故应急救援预案,确保这些制度符合国家相关法…

Day 49 卡玛笔记

这是基于代码随想录的每日打卡 1143. 最长公共子序列 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变…

WebXR教学 01 基础介绍

什么是WebXR? 定义 XR VR AR Web上使用XR技术的API WebXR 是一组用于在 Web 浏览器中实现虚拟现实(VR)和增强现实(AR)应用的技术标准。它由 W3C 的 Immersive Web 工作组开发,旨在提供跨设备的沉浸式体验…

DeepSeek+Kimi生成高质量PPT

DeepSeek与Kimi生成PPT全流程解析 一、工具分工原理 DeepSeek核心作用:生成结构化PPT大纲(擅长逻辑构建与内容优化)Kimi核心作用:将文本转换为视觉化PPT(提供模板库与排版引擎) 二、操作步骤详解 1. 通…

clickhouse--表引擎的使用

表引擎决定了如何存储表的数据。包括: 数据的存储方式和位置,写到哪里以及从哪里读取数据。(默认是在安装路径下的 data 路径)支持哪些查询以及如何支持。(有些语法只有在特定的引擎下才能用)并发数据访问。索引的使用&#xff0…

tauri输入js脚本的方法和注意事项initialization_script

注入js脚本最常用的就是initialization_script,通过这个方法注入的js脚本在页面每个页面都会执行,这个在tauri文档也可以搜到:WebviewWindowBuilder in tauri::webview - Rust,但是请注意,这个方法只能用在WindowBuild…

基于springboot的学习社区博客

一、系统架构 前端:html | bootstarp | jquery | css | ajax 后端:springboot | mybatis 环境:jdk1.8 | mysql | maven 二、代码及数据 三、功能介绍 01. web端-注册 02. web端-登录 03. web端-首页 04. web端-文章明…

python-leetcode 42.验证二叉搜索树

题目: 给定二叉树的根节点root,判断是否是一个有效二叉搜索树 有效二叉搜索树: 1.节点的左子树只包含小于当前节点的树 2.节点的右子树只包含大于当前节点的树 3.所有左子树和右子树自身必须也是二叉搜索树 方法一:递归 如果该二叉树的…

基于PSO-LSTM长短期记忆神经网络的多分类预测【MATLAB】

一、研究背景与意义 在时间序列分类、信号识别、故障诊断等领域,多分类预测任务对模型的时序特征捕捉能力提出了极高要求。传统LSTM网络虽能有效建模长程依赖关系,但其性能高度依赖超参数的选择,例如隐含层神经元数量、学习率、迭代次数等。…

拓扑排序的核心算法:BFS应用与实践

目录 一、拓扑排序简介 二、BFS解决拓扑排序的步骤 三、C实现 四、代码解释 五、总结 一、拓扑排序简介 拓扑排序是对有向无环图(DAG)进行排序的一种方法,使得对于图中的每一条有向边 (u, v),u 在排序中总是位于 v 的前面。拓…

Cocos Creator Shader入门实战(一):材质和Effect的了解

引擎版本:3.8.5 环境: Windows 简介 在Cocos Creator中,游戏炫彩缤纷的效果是借助着色器(Shader)来实现的。 Cocos主要基于OpenGL ES,而Shader的编写则是在可编程渲染管线中基于修改:顶点着色器(Vertex) 和 片段着色…

Android 老项目 jcenter 库失效

最近重新维护了一些老项目发现大部分jcenter库失效了, Could not resolve com.xx:2.1.3. 如果你也遇到了,不妨试试 替换为 aliyun的jcenter服务,就不用一个个找代替库了。 project 下的 build.gradle 文件添加: maven { url htt…