返回

鞭辟入里,丝丝入扣:LeetCode 第 21 题解谜,引领归并链表的正确姿势

前端

从初识到精通,逐步揭开归并链表的神秘面纱

在正式讲解归并链表的算法之前,让我们先来回顾一下链表的基本概念。链表是一种常见的数据结构,由一系列相互连接的节点组成,每个节点包含一个数据项和一个指向下一个节点的指针。链表的特点在于,它可以方便地进行插入和删除操作,但随机访问的效率较低。

归并链表算法的基本思想是将两个有序链表合并成一个新的有序链表。具体步骤如下:

  1. 初始化两个指针,分别指向两个链表的头结点。
  2. 比较两个指针所指节点的数据项,将较小的那个节点的数据项加入到新链表中。
  3. 将较小的那个节点的指针指向下一个节点。
  4. 重复步骤 2 和步骤 3,直到其中一个链表的指针指向空。
  5. 将另一个链表的剩余节点直接连接到新链表的末尾。

算法实例:手把手带你征服 LeetCode 第 21 题

为了更好地理解归并链表算法,我们不妨通过一个具体的例子来进行演示。假设我们有两个有序链表:

链表 11 -> 2 -> 4
链表 21 -> 3 -> 4

按照归并链表算法的步骤,我们将这两个链表合并成一个新的有序链表:

  1. 初始化两个指针,分别指向两个链表的头结点。
指针 11 -> 2 -> 4
指针 21 -> 3 -> 4
  1. 比较两个指针所指节点的数据项,将较小的那个节点的数据项加入到新链表中。
较小的节点:1
新链表:1
  1. 将较小的那个节点的指针指向下一个节点。
指针 12 -> 4
指针 21 -> 3 -> 4
  1. 重复步骤 2 和步骤 3,直到其中一个链表的指针指向空。
指针 12 -> 4
指针 23 -> 4

较小的节点:2
新链表:1 -> 2

指针 14
指针 23 -> 4

较小的节点:3
新链表:1 -> 2 -> 3

指针 1:
指针 24

较小的节点:4
新链表:1 -> 2 -> 3 -> 4
  1. 将另一个链表的剩余节点直接连接到新链表的末尾。
新链表:1 -> 2 -> 3 -> 4 -> 4

最终,我们得到了一个新的有序链表:

1 -> 2 -> 3 -> 4 -> 4

代码实现:用 Python 优雅地解决归并链表问题

掌握了归并链表算法的原理后,我们就可以用代码来实现它了。以下是用 Python 编写的归并链表算法的代码:

def merge_two_lists(list1, list2):
    """
    合并两个有序链表

    Args:
        list1 (ListNode): 第一个链表
        list2 (ListNode): 第二个链表

    Returns:
        ListNode: 合并后的有序链表
    """

    # 初始化两个指针,分别指向两个链表的头结点
    p1 = list1
    p2 = list2

    # 创建一个新的链表,并指向新链表的头结点
    dummy = ListNode(0)
    head = dummy

    # 比较两个指针所指节点的数据项,将较小的那个节点的数据项加入到新链表中
    while p1 and p2:
        if p1.val < p2.val:
            head.next = p1
            p1 = p1.next
        else:
            head.next = p2
            p2 = p2.next
        head = head.next

    # 将剩余的链表连接到新链表的末尾
    if p1:
        head.next = p1
    if p2:
        head.next = p2

    # 返回新链表的头结点
    return dummy.next

拓展思考:归并链表的应用场景

归并链表算法在计算机科学中有着广泛的应用,比如:

  • 排序算法。 归并排序是一种著名的排序算法,它使用归并链表算法将一个无序链表排序。
  • 数据合并。 归并链表算法可以用来合并两个有序的数据集,比如两个有序数组或两个有序链表。
  • 文件合并。 归并链表算法可以用来合并两个有序的文件,比如两个文本文件或两个二进制文件。

结语

归并链表算法是一种简单而有效的算法,它可以用来解决多种实际问题。通过这篇文章,你已经对归并链表算法有了深入的了解,并且学会了用 Python 实现它。希望你能在以后的学习和工作中灵活运用归并链表算法,解决遇到的问题。