LeetCode Hot100(25/100)——2. 两数相加(链表)

文章目录

一、题目简介

题目链接:LeetCode 两数相加

题目描述:

给定两个非空的链表,它们表示两个非负整数。数字按照逆序存储在链表中,每个节点只存储单个数字。请将这两个数相加,并以相同形式(逆序链表)返回一个新的链表。

示例:

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

二、题目分析

这道题的关键在于:

  • 链表形式的数值相加
  • 逆序存储
  • 进位处理

思维导图

两数相加问题
题目要求
逆序链表
逐位相加
处理进位
解法方向
模拟加法
同时遍历两个链表
维护进位变量carry
构建新链表
优化思路
使用哑节点 dummyHead
简化链表操作


三、解题思路讲解

1. 基本思路:模拟加法过程

核心思想:

我们按照小学算术加法的方式,逐位相加:

  • 同时遍历两个链表;
  • 如果某一链表已遍历完,则视其当前值为 0;
  • 计算当前节点值:
    sum = l1.val + l2.val + carry
  • 取个位作为新节点值:
    newNode.val = sum % 10
  • 更新进位:
    carry = sum / 10
  • 最后如果 carry ≠ 0,需要额外补一个节点表示进位。

流程图示意



开始
初始化 dummyHead, carry=0
同时遍历链表 l1 和 l2
sum = val1 + val2 + carry
新节点值 = sum % 10
carry = sum / 10
添加新节点到结果链表
是否还有节点或进位?
返回 dummyHead.next
结束


2. 示例演算

以题中示例链表为例:

复制代码
l1: 2 → 4 → 3   (代表342)
l2: 5 → 6 → 4   (代表465)

逐步相加过程:

步骤 l1.val l2.val carry sum 新结点值 新的carry
第一步 2 5 0 7 7 0
第二步 4 6 0 10 0 1
第三步 3 4 1 8 8 0

最终链表结果为:7 → 0 → 8

表示整数 807


四、Java代码实现

以下是完整的 Java 实现,结构清晰、易读性高:

java 复制代码
class ListNode {
    int val;
    ListNode next;
    ListNode(int val) {
        this.val = val;
    }
}

public class AddTwoNumbers {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode dummyHead = new ListNode(0); // 哑节点
        ListNode current = dummyHead;
        int carry = 0;

        while (l1 != null || l2 != null || carry != 0) {
            int val1 = (l1 != null) ? l1.val : 0;
            int val2 = (l2 != null) ? l2.val : 0;
            int sum = val1 + val2 + carry;

            carry = sum / 10;
            current.next = new ListNode(sum % 10);

            current = current.next;
            if (l1 != null) l1 = l1.next;
            if (l2 != null) l2 = l2.next;
        }
        return dummyHead.next;
    }
}

五、时间复杂度与空间复杂度分析

项目 复杂度 说明
时间复杂度 O(max(m, n)) 需要遍历两个链表的长度
空间复杂度 O(max(m, n)) 新链表节点的数量与较长链表相同

不存在额外的集合存储,仅需常数空间保存 carry 和若干指针。

相关推荐
wuweijianlove2 小时前
算法性能的渐近与非渐近行为对比的技术4
算法
_dindong2 小时前
cf1091div2 C.Grid Covering(数论)
c++·算法
AI成长日志2 小时前
【Agentic RL】1.1 什么是Agentic RL:从传统RL到智能体学习
人工智能·学习·算法
黎阳之光3 小时前
黎阳之光:视频孪生领跑者,铸就中国数字科技全球竞争力
大数据·人工智能·算法·安全·数字孪生
skywalker_113 小时前
力扣hot100-3(最长连续序列),4(移动零)
数据结构·算法·leetcode
6Hzlia3 小时前
【Hot 100 刷题计划】 LeetCode 17. 电话号码的字母组合 | C++ 回溯算法经典模板
c++·算法·leetcode
wfbcg3 小时前
每日算法练习:LeetCode 209. 长度最小的子数组 ✅
算法·leetcode·职场和发展
_日拱一卒3 小时前
LeetCode:除了自身以外数组的乘积
数据结构·算法·leetcode
计算机安禾3 小时前
【数据结构与算法】第36篇:排序大总结:稳定性、时间复杂度与适用场景
c语言·数据结构·c++·算法·链表·线性回归·visual studio
SatVision炼金士3 小时前
合成孔径雷达干涉测量(InSAR)沉降监测算法体系
算法