当前位置: 首页 > news >正文

可视化图解算法:链表相加( 两数相加)

1. 题目

描述

假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数。

给定两个这种链表,请生成代表两个整数相加值的结果链表。

数据范围:0≤n,m≤10000000 ,链表任意值 0≤val≤9 要求:空间复杂度 O(n),时间复杂度 O(n))

例如:链表 1 为 9->3->7,链表 2 为 6->3,最后生成新的结果链表为 1->0->0->0。

示例1

输入:

[9,3,7],[6,3]

返回值:

{1,0,0,0} 

示例2

输入:

[0],[6,3]

返回值:

{6,3}

2. 解题思路

对于给定的两个链表相加,首先是最后两个节点值的相加,接下来是倒数第二节点值的相加,从后向前执行节点值的相加。即:节点7与节点3相加,再执行节点3与节点6相加(还需加上进位数),最后是节点9与进位数的相加。

也就是说链表的遍历是从后向前的,因此需要先对链表进行反转,再进行节点值的相加操作,最后再对新生成的链表反转。

具体步骤如下:

第一步:反转链表。

对两个链表指向反转操作(如果对链表反转不太熟悉,可以参考前面的文章:《可视化图解算法:反转链表》)。

第二步:执行链表节点值相加操作。

在此过程中需要先定义一个虚拟头节点与进位的变量。

节点3与节点6相加,注意进位值carry=1:

h2指向为Null,新链表的节点为:h1指向的值+carry(进位值):

当h2与h1都指向Null时,需要判断进位值carry是否为0,如果不为0,需要将carry的值单独形成一个节点:

第三步:对新生成的链表反转。

反转之后的链表如下所示:

如果文字描述的不太清楚,你可以参考视频的详细讲解。

  • Python版本:数据结构笔试面试算法-Python语言版_哔哩哔哩_bilibili数据结构笔试面试算法-Python语言版,bilibili课堂,哔哩哔哩课堂,哔哩哔哩,Bilibili,B站,弹幕https://www.bilibili.com/cheese/play/ep1370398

  • Java版本:哔哩哔哩_bilibilihttps://www.bilibili.com/cheese/play/ep1366842

  • Golang版本:数据结构笔试面试算法-Go语言版_哔哩哔哩_bilibili数据结构笔试面试算法-Go语言版,bilibili课堂,哔哩哔哩课堂,哔哩哔哩,Bilibili,B站,弹幕https://www.bilibili.com/cheese/play/ep1364599

3. 编码实现

核心伪代码如下:

函数 合并链表并相加(head1, head2):
    # 处理空链表情况
    如果 head1 为空:
        返回 head2
    如果 head2 为空:
        返回 head1

    # 步骤1:翻转两个链表
    h1 = 调用 reverse 函数翻转(head1)
    h2 = 调用 reverse 函数翻转(head2)

    # 步骤2:执行相加操作
    创建临时头节点 tmp_head(值为-1)
    current = tmp_head
    carry = 0  # 进位值初始化

    # 遍历两个链表直到都处理完毕
    当 h1 不为空 或 h2 不为空 时:
        sum = carry  # 初始化为进位值
        
        如果 h1 不为空:
            sum += h1的值
            h1 指向下一个节点
        如果 h2 不为空:
            sum += h2的值
            h2 指向下一个节点

        # 计算新值和进位
        carry = sum // 10  # 取整数除法结果
        new_val = sum % 10  # 取余数

        # 创建新节点并连接
        current.next = 创建新节点(new_val)
        current = current.next

    # 处理最后可能的进位
    如果 carry > 0:
        current.next = 创建新节点(carry)

    # 步骤3:翻转最终结果链表
    结果链表 = 调用 reverse 函数翻转(tmp_head.next)
    返回 结果链表

具体完整代码你可以参考下面视频的详细讲解。

  • Python版本:数据结构笔试面试算法-Python语言版_哔哩哔哩_bilibili数据结构笔试面试算法-Python语言版,bilibili课堂,哔哩哔哩课堂,哔哩哔哩,Bilibili,B站,弹幕https://www.bilibili.com/cheese/play/ep1370398

  • Java版本:哔哩哔哩_bilibilihttps://www.bilibili.com/cheese/play/ep1366842

  • Golang版本:数据结构笔试面试算法-Go语言版_哔哩哔哩_bilibili数据结构笔试面试算法-Go语言版,bilibili课堂,哔哩哔哩课堂,哔哩哔哩,Bilibili,B站,弹幕https://www.bilibili.com/cheese/play/ep1364599

4.小结

两链表相加可以通过以下步骤完成:(1)反转链表;(2)执行链表节点值相加操作,在此过程中需要注意:当h2与h1都指向Null时,需要判断进位值carry是否为0,如果不为0,需要将carry的值单独形成一个节点;(3)对新生成的链表反转。

更多数据结构与算法视频讲解,你可以从以下地址找到:

  • Python编码实现:数据结构笔试面试算法-Python语言版_哔哩哔哩_bilibili数据结构笔试面试算法-Python语言版,bilibili课堂,哔哩哔哩课堂,哔哩哔哩,Bilibili,B站,弹幕https://www.bilibili.com/cheese/play/ep1509965

  • Java编码实现:哔哩哔哩_bilibilihttps://www.bilibili.com/cheese/play/ep1510007

  • Golang编码实现:哔哩哔哩_bilibilihttps://www.bilibili.com/cheese/play/ep1509945

对于链表的相关操作,我们总结了一套【可视化+图解】方法,依据此方法来解决链表相关问题,链表操作变得易于理解,写出来的代码可读性高也不容易出错。具体也可以参考视频详细讲解。

今日佳句:空山新雨后,天气晚来秋。

相关文章:

  • LabVIEW软件长时间运行导致蓝屏问题排查与优化
  • SpringCache小记
  • CentOS 7 设置 Nginx 开机自启(使用 Systemd)
  • 【Hbase】列族版本问题
  • sqli-labs学习记录6
  • 使用 Fetch API 实现流式读取
  • 单片机学习笔记——入门51单片机
  • 在windows下通过wsl工具管理Linux子系统
  • UDS诊断、ECU刷写、自动化测试、车联网测试、DTC故障注入测试、坏境测试、可靠性测试、压力测试、性能测试等
  • 计算机四级 - 数据库原理(操作系统部分)- 第5章「内存管理」
  • QT Quick(C++)跨平台应用程序项目实战教程 3 — 项目基本设置(窗体尺寸、中文标题、窗体图标、可执行程序图标)
  • C++:类和对象(含各编译器对编译过程的优化解释)详解[后篇]
  • Neo Gamma 机器人在 GTC 2025 上的突破性进展与表现分析
  • JVM运行时数据区内部结构难记?一个例子优化记忆
  • 避坑指南 | 阿里云服务器centos7上MySQL部署优化指南
  • C++之模板进阶
  • 亮相AWE2025,MOVA以科技重塑生活,以美学沟通世界
  • 标贝科技入选2025年市级数据要素市场化配置改革“揭榜挂帅”名单
  • 2025蓝桥杯备赛Day1——B2109 统计数字字符个数
  • 微信小游戏:跳一跳,自动化操作
  • 超新星|罚丢点球的那道坎,刘诚宇靠自己迈了过去
  • 普京提议无条件重启俄乌谈判,外交部:我们支持一切致力于和平的努力
  • 媒体和打拐志愿者暗访长沙一地下代孕实验室,警方已控制涉案人员
  • 河南洛阳新安县煤渣倾倒耕地:多年难恢复,为何至今未解决?
  • 欧盟决意与俄罗斯能源彻底决裂之际,美国谋划新生意:进口俄气对欧转售
  • 马上评丨规范隐藏式车门把手,重申安全高于酷炫