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


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

相关推荐
程序员清风2 小时前
Java 智能体开发:从对话接口到任务执行
java·人工智能·python
一 乐3 小时前
博客管理系统|基于springboot + vue博客管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·毕设
QuZhengRong3 小时前
【Spring】后端接收的请求参数多了一个逗号的处理办法
java·后端·spring
ZealSinger3 小时前
Go1.25容器感知GOMAXPROCS避限流
java·开发语言
cxoptics3 小时前
LBO 会不会潮解?存储、镀膜、日常使用注意事项?
java
SL_staff3 小时前
非研发人员搭业务逻辑?先认清这3个可视化编程分水岭
java
王闯写bug3 小时前
tomcat老版本下载tomcat8.5下载
java·tomcat
凤山老林3 小时前
Spring Boot DDD 分层架构落地:领域模型、聚合根与事件驱动的业务实战
java·spring boot·架构
自强的小白3 小时前
MYbatis-plus(自定义sql)
java·sql·mybatis
古法安卓3 小时前
Android-Ext4文件系统问题排查
android·java·android studio