力扣第二题详解:模拟竖式加法,链表操作如此简单
题目要求将两个非负整数以链表形式相加,并以相同形式的链表返回结果。两个链表中的每个节点代表一个数字位,且链表中的数字是逆序存储的(例如,数字 123 对应的链表为 3 -> 2 -> 1)。我们需要计算它们的和,并以相同的逆序链表形式返回。问题的核心在于模拟竖式加法,正确处理进位,并处理两个链表长度不同的情况。

解题思路与过程
1.哑节点简化操作
使用一个哑节点(head)作为新链表的起点,避免处理头节点的边界条件。
2.遍历链表并逐位相加
同时遍历两个输入链表,若其中一条链表已经遍历结束,则用值为 0 的节点代替,确保位数对齐。
3.处理进位
每次计算当前位的和时,需加上前一位的进位值 a,并更新新的进位值。
4.动态扩展结果链表
每次迭代生成一个新节点保存当前位的计算结果,并将其链接到结果链表中。
5.终止条件
当两条链表均遍历结束且进位值为 0 时,终止循环。
代码:
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* head = new ListNode; // 创建哑节点作为结果链表的起点
ListNode* head1 = head; // 保存哑节点指针,用于最终返回结果
int a = 0; // 进位值初始化为0
while (l1 || l2 || a != 0) { // 当链表未遍历完或仍有进位时继续
if (!l1) { // 若 l1 已结束,补零以对齐位数
l1 = new ListNode(0);
}
if (!l2) { // 若 l2 已结束,补零以对齐位数
l2 = new ListNode(0);
}
ListNode* node = new ListNode; // 创建新节点保存当前位的结果
head->next = node; // 将新节点链接到结果链表
node->val = (l1->val + l2->val + a) % 10; // 计算当前位的值
a = (l1->val + l2->val + a) / 10; // 更新进位值
head = head->next; // 移动结果链表指针
l1 = l1->next; // 移动 l1 指针
l2 = l2->next; // 移动 l2 指针
}
return head1->next; // 返回哑节点的下一个节点(即实际结果)
}
};原创内容 转载请注明出处






