Algorithms first

两数相加 · 交互式算法学习

把逆序链表表示的两个整数相加。

#2 · 链表

两数相加

Add Two Numbers

测试用例l1 = [2,4,3], l2 = [5,6,4]
链表3 个关键状态
步骤 12+5=7,写入 7。carry=0
2+5next
4+6next
3+4next
null
推荐

逐位相加与进位

时间 O(max(m,n))空间 O(1) 除答案

同步扫描两条链表,加上 carry 后生成当前位。

1function addTwoNumbers(a, b) {2  const dummy = {3    next: null4  };5  let p = dummy,6    carry = 0;7  while (a || b || carry) {8    const sum = (a?.val || 0) + (b?.val || 0) + carry;9    carry = Math.floor(sum / 10);10    p = p.next = {11      val: sum % 10,12      next: null13    };14    a = a?.next;15    b = b?.next;16  }17  return dummy.next;18}
多语言参考

Java · C++ · Go

来源 · CC BY-SA 4.0 ↗

这是一组同题正确实现,独立于上方当前动画方法;不同语言可能采用另一种正确策略。

1/**2 * Definition for singly-linked list.3 * public class ListNode {4 *     int val;5 *     ListNode next;6 *     ListNode() {}7 *     ListNode(int val) { this.val = val; }8 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }9 * }10 */11class Solution {12    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {13        ListNode dummy = new ListNode(0);14        int carry = 0;15        ListNode cur = dummy;16        while (l1 != null || l2 != null || carry != 0) {17            int s = (l1 == null ? 0 : l1.val) + (l2 == null ? 0 : l2.val) + carry;18            carry = s / 10;19            cur.next = new ListNode(s % 10);20            cur = cur.next;21            l1 = l1 == null ? null : l1.next;22            l2 = l2 == null ? null : l2.next;23        }24        return dummy.next;25    }26}
交互式算法学习

从执行步骤真正理解 LeetCode 经典 150

本站整理 150 道高频算法面试题和 302 种解法。动画方法同步展示 JavaScript 与 Python;每题另提供 Java、C++ 与 Go 同题参考实现。

多形态可视化数组、矩阵、DP 表、递归树、树图、链表、栈队列堆、区间和状态机按解法选择。
动画与代码同步当前状态、步骤说明、变量和代码高亮保持一一对应,可逐步播放和回退。
适合面试复习每种方案都给出思路、时间复杂度、空间复杂度、测试用例和 LeetCode 中文原题入口。
AlgoViz Lab

两数相加 · 解法对比

把逆序链表表示的两个整数相加。

测试用例
l1 = [2,4,3], l2 = [5,6,4]
题目分类
链表
解法对比
2
方案 1

转整数后相加

读取链表组成整数,相加后再拆成链表;大整数语言可能溢出。

时间
O(n)
空间
O(n)
方案 2

逐位相加与进位

同步扫描两条链表,加上 carry 后生成当前位。

时间
O(max(m,n))
空间
O(1) 除答案