(python) leetcode刷题——sort-list

本文介绍了一种在O(nlogn)时间内使用常数空间复杂度对单链表进行排序的算法,即链表的归并排序。通过递归找到链表中点并拆分,然后对左右两部分分别进行排序,最后归并起来。文章提供了详细的算法步骤和代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:
Sort a linked list in O(n log n) time using constant space complexity.

解析:
对单链表进行时间复杂度为O(nlogn),空间复杂度为O(1)的排序算法
单链表的归并排序时间复杂度为O(nlogn),由于结构特殊性,只需要一个辅助的节点,空间复杂度恒定。
下面作图演示算法过程:
1,输入:【3,4,2,1】
链表格式
2,递归找到链表中点mid并进行拆分:
在这里插入图片描述
3,对每次左右分别排序,引用辅助结点pre,并归并起来:
归并

代码:
找到中点并拆分操作:

def sort(arr):
    if arr is None or arr.next is None:
        return arr
    pre = arr
    mid = arr
    lon = arr
    while lon and lon.next:
        pre = mid
        mid = mid.next
        lon = lon.next.next
    left,right = arr,mid
    pre.next = None
    return sortlink(sort(left),sort(right))    
 

归并操作:

def sortlink(left,right):
    pre = node(-1)
    first = pre
    while left and right:
        if left.val > right.val:
            pre.next = right
            pre = right
            right = right.next
        else:
            pre.next = left
            pre = left
            left = left.next
    if left:
        pre.next = left
    else:
        pre.next = right
    return first.next

全部代码:

class node(object):
    def __init__(self,val,p = None):
        self.val = val
        self.next = p

def Linklist(a):
    for i in range(len(a)):
        a[i] = node(a[i])
    for i in range(len(a)-1):
        a[i].next = a[i+1]    
    return a

def sort(arr):
    if arr is None or arr.next is None:
        return arr
    pre = arr
    mid = arr
    lon = arr
    while lon and lon.next:
        pre = mid
        mid = mid.next
        lon = lon.next.next
    left,right = arr,mid
    pre.next = None
    return sortlink(sort(left),sort(right))   

 def sortlink(left,right):
    pre = node(-1)
    first = pre
    while left and right:
        if left.val > right.val:
            pre.next = right
            pre = right
            right = right.next
        else:
            pre.next = left
            pre = left
            left = left.next
    if left:
        pre.next = left
    else:
        pre.next = right
    return first.next

if __name__=='__main__':
    a = [3,4,2,1]
    Link = Linklist(a)
    s = Link[0]
    print('排序前:')
    while s:
        print(s.val)
        s = s.next 
    b = sort(Link[0])
    print('排序后:')
    while b:
        print(b.val)
        b = b.next
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值