Algorithms first
两数相加 · 交互式算法学习
把逆序链表表示的两个整数相加。
#2 · 链表
两数相加
Add Two Numbers
l1 = [2,4,3], l2 = [5,6,4]链表3 个关键状态
步骤 12+5=7,写入 7。
carry=02+5next
→4+6next
→3+4next
推荐
逐位相加与进位
时间
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}多语言参考
来源 · CC BY-SA 4.0 ↗Java · C++ · Go
这是一组同题正确实现,独立于上方当前动画方法;不同语言可能采用另一种正确策略。
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 同题参考实现。
AlgoViz Lab
两数相加 · 解法对比
把逆序链表表示的两个整数相加。
- 测试用例
l1 = [2,4,3], l2 = [5,6,4]- 题目分类
- 链表
- 解法对比
- 2
转整数后相加
读取链表组成整数,相加后再拆成链表;大整数语言可能溢出。
- 时间
O(n)- 空间
O(n)
逐位相加与进位
同步扫描两条链表,加上 carry 后生成当前位。
- 时间
O(max(m,n))- 空间
O(1) 除答案