## 题目详情:
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
输入:l1 = [2,4,3], l2 = [5,6,4] 输出:[7,0,8] 解释:342 + 465 = 807.
示例 2:
输入:l1 = [0], l2 = [0] 输出:[0]
示例 3:
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9] 输出:[8,9,9,9,0,0,0,1]
提示:
- 每个链表中的节点数在范围
[1, 100]
内 0 <= Node.val <= 9
- 题目数据保证列表表示的数字不含前导零
### 题目示例
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
解释:342 + 465 = 807.
### 解题思路
解决这个问题的步骤如下:
1. 初始化指针和虚拟节点:
创建两个指针 `p` 和 `q`,用于遍历两个输入的链表 `l1` 和 `l2`。
使用一个虚拟节点来简化结果链表头节点的管理。使用指针 `curr` 来添加新节点。
2. 遍历与相加:
同时遍历两个链表直到它们的末尾(`p` 和 `q` 都变成 `nullptr`)。
在每一步,从 `l1` 和 `l2` 的当前节点提取值。如果节点是 `nullptr`,则使用0作为该节点的值。
计算这些值及上一个节点的和的进位的总和。
要添加到结果链表的新数字是这个总和的个位数,新的进位是十位数。
3. 处理进位:
遍历完两个链表后,如果还有剩余进位(例如,和导致额外的数字),应在结果末尾添加一个新节点。
4. 返回结果:
结果链表从虚拟节点的下一个节点开始,因为虚拟节点用作初始占位符。
### 关键考虑
进位处理:这是至关重要的,因为两个数字的和可能超过9,需要传递到下一个节点。
长度不同:两个链表可能长度不同。算法应能处理当一个链表比另一个链表先遍历完的情况。
内存管理:在C++等语言中,需要正确创建和删除节点,以防内存泄漏。
第一次的错误代码:
问题和修正:
- 节点值的访问: 应使用
p->val
和q->val
而不是*p
和*q
。 - 进位的处理: 当你计算
num
时应使用num % 10
来获取新节点的值。 - 指针的更新: 你的条件检查有误,
if(q.next!=nullptr)
应改为if(q!=nullptr) q = q->next;
。 - 创建进位节点: 当
carry
不为0时,你应创建一个节点值为carry
的新节点,而不是new ListNode(0)
。 - 循环条件的逻辑运算符: 应使用逻辑或
||
而不是按位或|
。
太呆了,好久没写c++代码了,一开始就是很多低级错误,希望慢慢改进。
改进后的ac代码:
以下是leetcode上的一个大神的高效代码(写了一点小注释供大家参考,如有什么错误,请大家不不吝指出):