返回
LeetCode 2:链表中两数相加
后端
2023-10-06 16:55:01
引言
在计算机科学中,链表是一种常用的数据结构,它由一系列相互连接的节点组成,每个节点包含数据和指向下一个节点的指针。在 LeetCode 2:“链表中两数相加”这道题中,我们给出了两个非空的链表,表示两个非负整数。每个节点表示一个数字,数字按逆序存储,相邻节点表示高一位数字。我们的任务是将这两个整数相加,并将结果作为另一个链表返回。
解法一:迭代法
迭代法是一种逐节点遍历链表并执行相加操作的简单方法。我们从两个链表的头节点开始,逐节点遍历,将每个节点的值相加,并将和作为新链表的节点值。如果和大于等于 10,则将进位记为 1 并将其添加到下一轮相加中。下面是迭代法的详细步骤:
- 初始化结果链表: 创建一个新链表
result
,并将其头节点指向null
。 - 遍历链表: 同时遍历两个链表
l1
和l2
,直到其中一个链表为空。 - 相加: 将当前两个节点的值相加,并将和存储在变量
sum
中。 - 处理进位: 如果
sum
大于等于 10,则将进位记为 1 并将其添加到下一轮相加中。 - 创建新节点: 创建一个新节点
node
,并将sum % 10
作为其值。 - 添加到结果链表: 将新节点
node
添加到结果链表result
的尾部。 - 更新指针: 将
l1
和l2
指针移动到下一个节点。 - 处理剩余进位: 如果遍历结束后仍有进位,则创建一个新节点
node
,并将进位值 1 作为其值,将其添加到结果链表result
的尾部。
解法二:递归法
递归法也是解决链表相加问题的一种有效方法。该方法从链表的尾部开始,使用递归函数逐节点遍历并执行相加操作。递归函数返回一个二元组,其中第一个元素是新链表的尾节点,第二个元素是进位。下面是递归法的详细步骤:
- 递归函数: 定义一个递归函数
addTwoNumbers
,它接受两个链表l1
和l2
作为参数,并返回一个二元组(node, carry)
,其中node
是新链表的尾节点,carry
是进位。 - 递归基线: 如果
l1
和l2
都为空,则返回(null, 0)
。 - 计算和: 将
l1
和l2
的当前节点值相加,并将和存储在变量sum
中。 - 处理进位: 如果
sum
大于等于 10,则将进位记为 1 并将其添加到下一轮相加中。 - 创建新节点: 创建一个新节点
node
,并将sum % 10
作为其值。 - 递归调用: 递归调用
addTwoNumbers
函数,以处理剩余的链表节点,并获得新的尾节点和进位。 - 链接新节点: 将新节点
node
链接到递归函数返回的尾节点后面。 - 返回二元组: 返回二元组
(node, carry)
,其中node
是新链表的尾节点,carry
是进位。
总结
链表中两数相加问题是 LeetCode 中一道经典的题目,它考验了链表操作和数字相加的算法技巧。本文介绍了两种不同的解法,包括迭代法和递归法。这两种方法各有优缺点,可以根据实际情况选择使用。掌握这些算法技巧对于解决更复杂的链表和数字操作问题至关重要。