返回

剖析LeetCode 148:巧用排序链表,轻松化繁为简

前端

拨开云雾,洞悉归并排序的精髓

归并排序是一种高效、稳定的排序算法,广泛应用于各种数据结构的排序。其基本思想是将链表拆分成两个子链表,对子链表进行排序,然后合并排序后的子链表。

1. 拆分链表,逐个击破:

首先,我们需要找到链表的中点,将链表拆分成两个子链表。我们可以使用快慢指针法来实现。快指针每次移动两步,慢指针每次移动一步。当快指针到达链表末尾时,慢指针所指的位置就是链表的中点。

2. 征服子链表,分而治之:

接下来,我们需要对拆分后的两个子链表分别进行归并排序。我们可以递归地调用归并排序函数,将子链表进一步拆分成更小的子链表,直到每个子链表只有一个元素。

3. 合并子链表,合二为一:

最后,我们需要将排序后的子链表合并成一个有序的链表。我们可以使用双指针法来实现。我们将两个子链表的指针分别指向第一个元素,比较两个元素的大小,将较小的元素添加到结果链表中,然后将指针指向下一个元素。重复此过程,直到两个子链表都为空。

在Python的怀抱中,演绎归并排序的舞步

def merge_sort(head):
  """
  对链表进行归并排序。

  参数:
    head:链表的头结点。

  返回:
    排序后的链表的头结点。
  """

  # 如果链表为空或只有一个元素,直接返回。
  if head is None or head.next is None:
    return head

  # 找到链表的中点。
  slow = head
  fast = head.next
  while fast and fast.next:
    slow = slow.next
    fast = fast.next.next

  # 拆分链表。
  mid = slow.next
  slow.next = None

  # 递归地对两个子链表进行排序。
  left_head = merge_sort(head)
  right_head = merge_sort(mid)

  # 合并排序后的子链表。
  return merge(left_head, right_head)


def merge(left_head, right_head):
  """
  合并两个有序的链表。

  参数:
    left_head:第一个有序链表的头结点。
    right_head:第二个有序链表的头结点。

  返回:
    合并后有序链表的头结点。
  """

  # 创建一个虚拟头结点。
  dummy = ListNode(0)

  # 指针指向虚拟头结点。
  current = dummy

  # 比较两个链表的元素,将较小的元素添加到结果链表中。
  while left_head and right_head:
    if left_head.val < right_head.val:
      current.next = left_head
      left_head = left_head.next
    else:
      current.next = right_head
      right_head = right_head.next

    # 将指针指向下一个元素。
    current = current.next

  # 将剩余的元素添加到结果链表中。
  if left_head:
    current.next = left_head
  if right_head:
    current.next = right_head

  # 返回虚拟头结点的下一个节点,即结果链表的头结点。
  return dummy.next

结语:

LeetCode 148:排序链表是一个经典的算法问题,也是学习归并排序算法的绝佳范例。通过本文的详细讲解和代码示例,您将对归并排序算法有更深入的理解。希望本文能对您的编程之旅有所帮助。