【LeetCode】两数相加:模拟加法竖式,用进位 flag 一次遍历解决

题目

给你两个逆序存储 的链表,每个节点存一位数字(0-9)。要求返回它们相加后同样逆序的结果链表。

示例:l1 = [2,4,3], l2 = [5,6,4] → 输出 [7,0,8]

(即 342 + 465 = 807)


思路

就是模拟小学加法竖式:

  • 从个位开始,一位一位加

  • 当前位 = (l1值 + l2值 + 上一位进位) % 10

  • 进位 = 总和 / 10

  • 哪个链表先走完就当它是 0

  • 最后还有进位就再多补一位


代码

复制代码
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode result = new ListNode(0);
        ListNode curr = result;
        int flag = 0;

        while (l1 != null || l2 != null || flag != 0) {
            int x = (l1 != null) ? l1.val : 0;
            int y = (l2 != null) ? l2.val : 0;

            int sum = x + y + flag;
            flag = sum / 10;

            curr.next = new ListNode(sum % 10);
            curr = curr.next;

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

        return result.next;
    }
}

关键点

细节 为什么
flag 初始为 0 第一位没有来自上一位的进位
循环条件带 flag != 0 防止最后一步还有进位没处理(如 999 + 1)
用 0 补位 统一逻辑,不用分开讨论两个链表长度不同的情况
sum / 10 一行同时处理进位和清零,不用 if 判断

复杂度

  • 时间:O(max(m, n)),每个节点只遍历一次

  • 空间:O(max(m, n)),结果链表长度


核心就一句话:模拟加法,满十进一,别忘了最后可能还多进一位

相关推荐
high一马平川几秒前
# SystemUI Dagger2 精读 · 第 2 章 @Inject:1200 处构造注入,和 1 处例外
android·java·kotlin
小陈从不会敲代码2 分钟前
JavaEE面试复习(多线程-初阶)
java·面试·java-ee
周厉3 分钟前
酒店PMS系统设计:房型房价管理与动态价格优先级实现(Java/MySQL)
java·数据库·pms酒店系统
一碗白开水一9 分钟前
Day 5 · 弹性 | 微观
java·前端·数据库
迪飞特科技9 分钟前
大模型接入业务系统:API、本地部署、RAG、智能体四种路线怎么选
java·数据库·人工智能·知识图谱·deepseek·本地化大模型
vipxieliang28 分钟前
ValidX 验证器缓存机制:如何提升验证性能
java·spring boot
未秃头的程序猿39 分钟前
Spring Cloud Gateway 做统一加解密,我在请求体上栽了三天
java·后端·架构
Rain的Java大神之路40 分钟前
别再上来就堆 Redis!点赞系统从打挂数据库到 18w 写峰值,我把这套方案讲透了
java·后端·面试
SimonKing43 分钟前
开源文档解析天花板 MinerU 4.0:PDF / 图片 / Office 等任意文档都支持
java·后端·程序员
咖啡八杯1 小时前
Spring MessageSource 国际化消息解析流程
java·后端·spring·架构·框架·若依