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


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

相关推荐
zzzll11112 小时前
Spring Boot 实现数据脱敏:自定义注解 + Jackson 序列化器
java·spring boot·后端
lhldsg9 小时前
全民健身解决方案小程序开发:从0到1的技术实战
java·数据库·需求分析
jason成都9 小时前
Spring WebFlux 适配达梦新方案|dm‑r2dbc:Netty 异步传输的实验性 R2DBC 驱动
java·后端·spring
泡海椒9 小时前
内置SPI函数库详解:JQuick-Java Builtin工具类实战用法
java·开发语言·python
辰烨chenye9 小时前
LeetCode Hot 100 题解 · 二分篇
java·算法·leetcode
小羊没烦恼!10 小时前
Hello Web API系列教程——Web API与国际化
java·服务器·前端·javascript·php
小荷才露尖尖角,早有蜻蜓立上头11 小时前
过滤器的4种创建方式
java
大圣编蚕11 小时前
Java ByteArrayInputStream 详解:从入门到实战
java·开发语言·算法
程序员阿明11 小时前
idea把插件啥的不默认放在C盘
java·ide·intellij-idea