数据结构与算法之 leetcode 链表排序 归并排序 / 插入排序

数据结构与算法阿木 发布于 3 天前 1 次阅读


链表排序:归并排序与插入排序的LeetCode实践

链表作为一种常见的数据结构,在计算机科学中扮演着重要的角色。链表排序是链表操作中的一个基础且重要的任务。本文将围绕LeetCode平台上的链表排序问题,深入探讨归并排序和插入排序两种算法的实现,并分析它们的优缺点。

LeetCode是一个在线编程社区,提供了大量的编程题目,旨在帮助程序员提高编程技能。链表排序问题是LeetCode上的经典题目之一,它考察了我们对链表操作和数据结构的理解。本文将结合归并排序和插入排序两种算法,对链表排序问题进行深入分析。

归并排序

归并排序是一种分治算法,其基本思想是将待排序的序列分为若干个子序列,每个子序列都是有序的,然后将这些有序子序列合并成一个完整的有序序列。

归并排序的链表实现

在链表上实现归并排序,我们需要定义一个合并函数,用于合并两个有序链表。以下是归并排序在链表上的实现代码:

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):


dummy = ListNode(0)


tail = dummy

while left and right:


if left.val < right.val:


tail.next = left


left = left.next


else:


tail.next = right


right = right.next


tail = tail.next

tail.next = left if left else right


return dummy.next


分析

归并排序在链表上的实现具有以下特点:

1. 时间复杂度:O(nlogn),其中n是链表的长度。

2. 空间复杂度:O(1),因为归并排序是就地排序。

3. 稳定性:归并排序是稳定的排序算法。

插入排序

插入排序是一种简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

插入排序的链表实现

在链表上实现插入排序,我们需要遍历链表,将每个节点插入到已排序的子链表中。以下是插入排序在链表上的实现代码:

python

class ListNode:


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


self.val = val


self.next = next

def insertion_sort(head):


if not head or not head.next:


return head

sorted_list = head


current = head.next


sorted_list.next = None

while current:


next_node = current.next


sorted_list = insert_node(sorted_list, current)


current = next_node

return sorted_list

def insert_node(sorted_list, node):


if not sorted_list or node.val <= sorted_list.val:


node.next = sorted_list


return node

current = sorted_list


while current.next and current.next.val < node.val:


current = current.next

node.next = current.next


current.next = node


return sorted_list


分析

插入排序在链表上的实现具有以下特点:

1. 时间复杂度:O(n^2),其中n是链表的长度。

2. 空间复杂度:O(1),因为插入排序是就地排序。

3. 稳定性:插入排序是稳定的排序算法。

总结

本文介绍了归并排序和插入排序在链表上的实现,并分析了它们的优缺点。归并排序在链表上的实现具有较好的时间复杂度和稳定性,但空间复杂度较高;而插入排序在链表上的实现具有较低的空间复杂度,但时间复杂度较高。在实际应用中,我们可以根据具体需求选择合适的排序算法。

在LeetCode平台上,链表排序问题是一个常见的面试题。通过掌握归并排序和插入排序在链表上的实现,我们可以更好地应对这类问题。希望本文能对您有所帮助。