两数相加:链表操作的基础与扩展

news2025/1/29 13:55:58

两数相加:链表操作的基础与扩展

引言

链表(Linked List)是一种灵活且高效的数据结构,特别适用于动态增删操作。无论是初学者还是资深程序员,链表的基本操作都是算法学习中的重要一环。而 “两数相加” 问题则是链表操作的经典案例,通过它不仅可以掌握链表的基本操作,还能启发我们在更复杂的算法场景中扩展应用。

本文将从基础入手,逐步解析 “两数相加” 的链表操作,并探讨其在实际场景中的扩展应用。


问题描述

给定两个非空链表,分别表示两个非负整数。这些数字以倒序存储,每个节点包含一个数字。我们需要将两个数字相加,并返回一个新的链表表示其和。

例如:

输入:

链表1:2 -> 4 -> 3  (表示数字 342)
链表2:5 -> 6 -> 4  (表示数字 465)

输出:

链表结果:7 -> 0 -> 8  (表示数字 807)

基础实现
数据结构定义

在 Python 中,我们使用如下定义表示链表:

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val  # 当前节点的值
        self.next = next  # 指向下一个节点
核心算法

核心步骤包括:

  1. 遍历两个链表,逐位相加。
  2. 处理进位。
  3. 将结果存入新的链表。

以下是完整代码实现:

class Solution:
    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
        dummy = ListNode()  # 哨兵节点,方便操作
        current = dummy
        carry = 0  # 初始化进位

        while l1 or l2 or carry:
            val1 = l1.val if l1 else 0  # 获取链表1的当前值
            val2 = l2.val if l2 else 0  # 获取链表2的当前值

            # 计算当前位的和以及进位
            total = val1 + val2 + carry
            carry = total // 10  # 进位值
            current.next = ListNode(total % 10)  # 当前位结果存入新节点

            # 移动到下一个节点
            current = current.next
            if l1:
                l1 = l1.next
            if l2:
                l2 = l2.next

        return dummy.next  # 返回结果链表
示例运行

我们用以下代码验证:

# 创建链表1: 2 -> 4 -> 3
l1 = ListNode(2, ListNode(4, ListNode(3)))
# 创建链表2: 5 -> 6 -> 4
l2 = ListNode(5, ListNode(6, ListNode(4)))

# 调用算法
solution = Solution()
result = solution.addTwoNumbers(l1, l2)

# 输出结果
while result:
    print(result.val, end=" -> " if result.next else "\n")
    result = result.next

输出:

7 -> 0 -> 8

扩展应用
1. 更复杂的进位场景

当链表长度不一致时,算法依然能够正确处理。例如:

  • 链表1:9 -> 9 (表示 99)
  • 链表2:1 (表示 1)

结果:0 -> 0 -> 1 (表示 100)。

这归功于 carry 的有效处理,即使两个链表遍历完毕,仍然可以处理进位。

2. 实际应用场景
  • 大数计算:链表可用来存储超出普通整型范围的大数(如科学计算)。
  • 链表的合并:类似的逻辑可以用于合并两个有序链表,或实现多链表的动态操作。
  • 内存优化:与数组相比,链表的动态特性可避免内存浪费,特别是在需要频繁增删的场景下。
3. 代码优化与变体
  • 递归实现
    使用递归简化迭代逻辑,但需要注意可能的栈溢出。
def addTwoNumbersRecursive(l1, l2, carry=0):
    if not l1 and not l2 and not carry:
        return None

    val1 = l1.val if l1 else 0
    val2 = l2.val if l2 else 0
    total = val1 + val2 + carry

    node = ListNode(total % 10)
    node.next = addTwoNumbersRecursive(
        l1.next if l1 else None,
        l2.next if l2 else None,
        total // 10
    )
    return node
  • 链表反向存储
    如果链表按正序存储(如 3 -> 4 -> 2 表示 342),可以先反转链表再执行上述逻辑,最终再反转结果链表。

结语

通过 “两数相加” 问题,我们不仅掌握了链表的基本操作,还能感受到算法设计中的精妙之处。这类问题的解法不仅限于编程竞赛,它在大数计算、动态数据处理等场景中同样具有实用价值。

学习链表操作,不仅是为了通过面试,更是为了在实际开发中构建高效、灵活的算法。希望本文的讲解能激发你对链表以及算法设计更深入的思考!

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

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

相关文章

分布式系统学习:小结

关于分布式系统的学习就暂时告一段落了,下面整理了个思维导图,只涉及分布式的一些相关概念,需要的可自取。后面准备写下关于AI编程相关的技术文章,毕竟要紧跟时代的脚步嘛 思维导图xmind文件下载地址:https://download…

基于STM32的阿里云智能农业大棚

目录 前言: 项目效果演示: 一、简介 二、硬件需求准备 三、硬件框图 四、CubeMX配置 4.1、按键、蜂鸣器GPIO口配置 4.2、ADC输入配置 4.3、IIC——驱动OLED 4.4、DHT11温湿度读取 4.5、PWM配置——光照灯、水泵、风扇 4.6、串口——esp8266模…

WGCLOUD使用介绍 - 如何监控ActiveMQ和RabbitMQ

根据WGCLOUD官网的信息,目前没有针对ActiveMQ和RabbitMQ这两个组件专门做适配 不过可以使用WGCLOUD已经具备的通用监测模块:进程监测、端口监测或者日志监测、接口监测 来对这两个组件进行监控

Win11画图工具没了怎么重新安装

有些朋友想要简单地把图片另存为其他格式,或是进行一些编辑,但是发现自己的Win11系统里面没有画图工具,这可能是因为用户安装的是精简版的Win11系统,解决方法自然是重新安装一下画图工具,具体应该怎么做呢?…

“AI质量评估系统:智能守护,让品质无忧

嘿,各位小伙伴们!今天咱们来聊聊一个在现代社会中越来越重要的角色——AI质量评估系统。你知道吗?在这个快速发展的时代,产品质量已经成为企业生存和发展的关键。而AI质量评估系统,就像是我们的智能守护神,…

Ubuntu 顶部状态栏 配置,gnu扩展程序

顶部状态栏 默认没有配置、隐藏的地方 安装使用Hide Top Bar 或Just Perfection等进行配置 1 安装 sudo apt install gnome-shell-extension-manager2 打开 安装的“扩展管理器” 3. 对顶部状态栏进行配置 使用Hide Top Bar 智能隐藏,或者使用Just Perfection 直…

FPGA 使用 CLOCK_LOW_FANOUT 约束

使用 CLOCK_LOW_FANOUT 约束 您可以使用 CLOCK_LOW_FANOUT 约束在单个时钟区域中包含时钟缓存负载。在由全局时钟缓存直接驱动的时钟网段 上对 CLOCK_LOW_FANOUT 进行设置,而且全局时钟缓存扇出必须低于 2000 个负载。 注释: 当与其他时钟约束配合…

RabbitMQ模块新增消息转换器

文章目录 1.目录结构2.代码1.pom.xml 排除logging2.RabbitMQConfig.java3.RabbitMQAutoConfiguration.java 1.目录结构 2.代码 1.pom.xml 排除logging <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/PO…

机器学习:支持向量机

支持向量机&#xff08;Support Vector Machine&#xff09;是一种二类分类模型&#xff0c;其基本模型定义为特征空间上的间隔最大的广义线性分类器&#xff0c;其学习策略便是间隔最大化&#xff0c;最终可转化为一个凸二次规划问题的求解。 假设两类数据可以被 H x : w T x…

Spring Boot(6)解决ruoyi框架连续快速发送post请求时,弹出“数据正在处理,请勿重复提交”提醒的问题

一、整个前言 在基于 Ruoyi 框架进行系统开发的过程中&#xff0c;我们常常会遇到各种有趣且具有挑战性的问题。今天&#xff0c;我们就来深入探讨一个在实际开发中较为常见的问题&#xff1a;当连续快速发送 Post 请求时&#xff0c;前端会弹出 “数据正在处理&#xff0c;请…

2023年版本IDEA复制项目并修改端口号和运行内存

2023年版本IDEA复制项目并修改端口号和运行内存 1 在idea中打开server面板&#xff0c;在server面板中选择需要复制的项目右键&#xff0c;点击弹出来的”复制配置…&#xff08;Edit Configuration…&#xff09;“。如果idea上没有server面板或者有server面板但没有springbo…

微信小程序怎么制作自己的小程序?手把手带你入门(适合新手小白观看)

对于初学者来说&#xff0c;制作一款微信小程序总感觉高大上&#xff0c;又害怕学不会。不过&#xff0c;今天我就用最简单、最有耐心的方式&#xff0c;一步一步给大家讲清楚!让你知道微信小程序的制作&#xff0c;居然可以这么轻松(希望你别吓跑啊!)。文中还加了实战经验&…

EventBus事件总线的使用以及优缺点

EventBus EventBus &#xff08;事件总线&#xff09;是一种组件通信方法&#xff0c;基于发布/订阅模式&#xff0c;能够实现业务代码解耦&#xff0c;提高开发效率 发布/订阅模式 发布/订阅模式是一种设计模式&#xff0c;当一个对象的状态发生变化时&#xff0c;所有依赖…

vim如何设置自动缩进

:set autoindent 设置自动缩进 :set noautoindent 取消自动缩进 &#xff08;vim如何使设置自动缩进永久生效&#xff1a;vim如何使相关设置永久生效-CSDN博客&#xff09;

LongLoRA:高效扩展大语言模型上下文长度的微调方法

论文地址&#xff1a;https://arxiv.org/abs/2309.12307 github地址&#xff1a;https://github.com/dvlab-research/LongLoRA 1. 背景与挑战 大语言模型&#xff08;LLMs&#xff09;通常在预定义的上下文长度下进行训练&#xff0c;例如 LLaMA 的 2048 个 token 和 Llama2 的…

NoSQL使用详解

文章目录 NoSQL使用详解一、引言二、NoSQL数据库的基本概念三、NoSQL数据库的分类及使用场景1. 键值存储数据库示例代码&#xff08;Redis&#xff09;&#xff1a; 2. 文档存储数据库示例代码&#xff08;MongoDB&#xff09;&#xff1a; 3. 列存储数据库4. 图数据库 四、使用…

《FreqMamba: 从频率角度审视图像去雨问题》学习笔记

paper&#xff1a;FreqMamba: Viewing Mamba from a Frequency Perspective for Image Deraining GitHub&#xff1a;GitHub - aSleepyTree/FreqMamba 目录 摘要 1、介绍 2、相关工作 2.1 图像去雨 2.2 频率分析 2.3 状态空间模型 3、方法 3.1 动机 3.2 预备知识 3…

试用ChatGPT开发一个大语言模型聊天App

参考官方文档&#xff0c;安装android studio https://developer.android.com/studio/install?hlzh-cn 参考这个添加permission权限&#xff1a; https://blog.csdn.net/qingye_love/article/details/14452863 参考下面链接完成Android Studio 给项目添加 gradle 依赖 ht…

第30周:文献阅读

目录 摘要 Abstract 文献阅读 问题引入 方法论 堆叠集成模型 深度学习模型 创新点 堆叠模型 敏感性和不确定性分析 优化模型 实验研究 数据集 水质指数WQI的计算 模型的构建与训练 模型性能评估 敏感性和不确定性分析 结论 摘要 本文聚焦于利用深度学习算…

The just sharing principle: advice for advice givers

原文 A while ago I wrote about how Only you know what’s best for your application. That’s because only you fully understand the context within which you are making technical decisions. Any advice need to filtered through that context in order to determi…