题目
给你两个逆序存储 的链表,每个节点存一位数字(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)),结果链表长度
核心就一句话:模拟加法,满十进一,别忘了最后可能还多进一位