【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)),结果链表长度


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

相关推荐
aiks_yuan16 小时前
Java CPU 100% 怎么排查:JDK 11 起 jstack 自带线程 CPU 时间,不用再 top -H 换算十六进制(JDK 8、11、17 实测)
java
Flynn Liang17 小时前
AiServices 源码级拆解:一个接口如何变成 RAG Agent
java·langchain·源码分析·rag·langchain4j·aiservices
Flynn Liang18 小时前
LangChain4j 1.23 架构全景:Java 大模型应用的 6 层抽象
java·langchain·大模型·rag·ai agent·langchain4j
聪明的笨猪猪18 小时前
实际工程问题:AI生成Redis分布式锁的原子性缺陷导致库存超卖
java·经验分享·面试·ai编程
软件技术NINI19 小时前
基于SpringBoot和Vue的新能源汽车销售推荐系统
java·vue.js·spring boot·后端·汽车·毕业设计·毕设
Flynn Liang19 小时前
LangChain4j 生产级工程骨架:12 个模块 + Docker 一键启动
java·spring boot·langchain·rag·langchain4j
噢,我明白了21 小时前
JAVA中的一些基础应用知识点
java·开发语言
SL_staff21 小时前
私有化低代码不是妥协,而是企业级数字化的自主可控主航道
java
装不满的克莱因瓶21 小时前
【SpringAI Alibaba】ReactAgent结构化输出OutputType与OutputSchema实战
java·人工智能·ai·springai·springaialibaba
秋天的怀念_David1 天前
算法一千零一夜 · 第二十八夜 注册
java·程序人生·算法