数据结构与算法之 leetcode 链表排序链表 归并排序递归实现

数据结构与算法阿木 发布于 2025-07-12 12 次阅读


摘要:

链表排序是数据结构与算法领域中的一个经典问题,归并排序因其稳定性和高效的分治策略,在链表排序中尤为适用。本文将围绕LeetCode上的链表排序问题,详细介绍归并排序的递归实现方法,并通过实际代码示例进行分析。

一、

链表是一种常见的数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表排序是链表操作中的一个重要环节,而归并排序因其分治策略,在链表排序中表现出色。本文将深入探讨归并排序在LeetCode链表排序问题中的应用。

二、归并排序概述

归并排序是一种分治算法,其基本思想是将待排序的序列分为若干个子序列,每个子序列都是有序的,然后将这些有序子序列合并成一个完整的有序序列。归并排序的时间复杂度为O(nlogn),空间复杂度为O(n)。

三、归并排序在链表排序中的应用

归并排序在链表排序中的应用主要分为以下步骤:

1. 分解:将链表分为两个子链表,每个子链表包含链表的一半元素。

2. 排序:对两个子链表进行归并排序。

3. 合并:将两个有序子链表合并成一个有序链表。

四、递归实现

以下是一个使用递归实现的归并排序链表排序的代码示例:

python

class ListNode:


def __init__(self, val=0, next=None):


self.val = val


self.next = next

def merge_sort(head):


if not head or not head.next:


return head

分解链表


middle = get_middle(head)


next_to_middle = middle.next


middle.next = None

递归排序


left = merge_sort(head)


right = merge_sort(next_to_middle)

合并排序后的链表


sorted_list = merge(left, right)


return sorted_list

def get_middle(head):


if not head:


return head

slow = head


fast = head

while fast.next and fast.next.next:


slow = slow.next


fast = fast.next.next

return slow

def merge(left, right):


if not left:


return right


if not right:


return left

if left.val <= right.val:


temp = left


left = left.next


else:


temp = right


right = right.next

head = temp


while left and right:


if left.val <= right.val:


temp.next = left


left = left.next


else:


temp.next = right


right = right.next


temp = temp.next

if not left:


temp.next = right


if not right:


temp.next = left

return head

测试代码


def print_list(head):


while head:


print(head.val, end=" ")


head = head.next


print()

创建链表


head = ListNode(4)


head.next = ListNode(2)


head.next.next = ListNode(1)


head.next.next.next = ListNode(3)

排序链表


sorted_head = merge_sort(head)


print_list(sorted_head)


五、总结

本文详细介绍了归并排序在LeetCode链表排序问题中的应用。通过递归实现,我们能够有效地对链表进行排序。在实际应用中,归并排序在链表排序中具有广泛的应用前景。

六、扩展

1. 非递归实现:除了递归实现,还可以使用迭代的方式实现归并排序链表。

2. 优化:在实际应用中,可以根据链表的特点对归并排序进行优化,例如使用尾递归优化等。

通过本文的学习,相信读者对归并排序在链表排序中的应用有了更深入的了解。在实际编程过程中,可以根据具体问题选择合适的排序算法,以提高代码的效率和可读性。