返回

LeetCode 2:链表中两数相加

后端

引言

在计算机科学中,链表是一种常用的数据结构,它由一系列相互连接的节点组成,每个节点包含数据和指向下一个节点的指针。在 LeetCode 2:“链表中两数相加”这道题中,我们给出了两个非空的链表,表示两个非负整数。每个节点表示一个数字,数字按逆序存储,相邻节点表示高一位数字。我们的任务是将这两个整数相加,并将结果作为另一个链表返回。

解法一:迭代法

迭代法是一种逐节点遍历链表并执行相加操作的简单方法。我们从两个链表的头节点开始,逐节点遍历,将每个节点的值相加,并将和作为新链表的节点值。如果和大于等于 10,则将进位记为 1 并将其添加到下一轮相加中。下面是迭代法的详细步骤:

  1. 初始化结果链表: 创建一个新链表 result,并将其头节点指向 null
  2. 遍历链表: 同时遍历两个链表 l1l2,直到其中一个链表为空。
  3. 相加: 将当前两个节点的值相加,并将和存储在变量 sum 中。
  4. 处理进位: 如果 sum 大于等于 10,则将进位记为 1 并将其添加到下一轮相加中。
  5. 创建新节点: 创建一个新节点 node,并将 sum % 10 作为其值。
  6. 添加到结果链表: 将新节点 node 添加到结果链表 result 的尾部。
  7. 更新指针:l1l2 指针移动到下一个节点。
  8. 处理剩余进位: 如果遍历结束后仍有进位,则创建一个新节点 node,并将进位值 1 作为其值,将其添加到结果链表 result 的尾部。

解法二:递归法

递归法也是解决链表相加问题的一种有效方法。该方法从链表的尾部开始,使用递归函数逐节点遍历并执行相加操作。递归函数返回一个二元组,其中第一个元素是新链表的尾节点,第二个元素是进位。下面是递归法的详细步骤:

  1. 递归函数: 定义一个递归函数 addTwoNumbers,它接受两个链表 l1l2 作为参数,并返回一个二元组 (node, carry),其中 node 是新链表的尾节点,carry 是进位。
  2. 递归基线: 如果 l1l2 都为空,则返回 (null, 0)
  3. 计算和:l1l2 的当前节点值相加,并将和存储在变量 sum 中。
  4. 处理进位: 如果 sum 大于等于 10,则将进位记为 1 并将其添加到下一轮相加中。
  5. 创建新节点: 创建一个新节点 node,并将 sum % 10 作为其值。
  6. 递归调用: 递归调用 addTwoNumbers 函数,以处理剩余的链表节点,并获得新的尾节点和进位。
  7. 链接新节点: 将新节点 node 链接到递归函数返回的尾节点后面。
  8. 返回二元组: 返回二元组 (node, carry),其中 node 是新链表的尾节点,carry 是进位。

总结

链表中两数相加问题是 LeetCode 中一道经典的题目,它考验了链表操作和数字相加的算法技巧。本文介绍了两种不同的解法,包括迭代法和递归法。这两种方法各有优缺点,可以根据实际情况选择使用。掌握这些算法技巧对于解决更复杂的链表和数字操作问题至关重要。