返回
剖析LeetCode 148:巧用排序链表,轻松化繁为简
前端
2023-12-31 23:33:14
拨开云雾,洞悉归并排序的精髓
归并排序是一种高效、稳定的排序算法,广泛应用于各种数据结构的排序。其基本思想是将链表拆分成两个子链表,对子链表进行排序,然后合并排序后的子链表。
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:排序链表是一个经典的算法问题,也是学习归并排序算法的绝佳范例。通过本文的详细讲解和代码示例,您将对归并排序算法有更深入的理解。希望本文能对您的编程之旅有所帮助。