148. Sort List (python)

Sort a linked list in O(n log n) time using constant space complexity.
思路:能够有O(n lgn)时间复杂度的算法为,快速排序,堆排序,归并排序,三者的空间复杂度分别为O(1), O(N),O(N)
其中归并排序,其的基本思路就是将数组分成二组A,B,如果这二组组内的数据都是有序的,那么就可以很方便的将这二组数据进行排序。如何让这二组组内数据有序了,可以将A,B组各自再分成二组。依次类推,当分出来的小组只有一个数据时,可以认为这个小组组内已经达到了有序,然后再合并相邻的二个小组就可以了。这样通过先递归的分解数列,再合并数列就完成了归并排序。
此题采用归并排序,因为链表的排序不需要像数组那样单独分配一个新数组空间。
结合109. Convert Sorted List to Binary Search Tree 和21. Merge Two Sorted Lists
109即一颗归并二叉树,21再将二叉树的结点合并即可
Runtime: 422 ms

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def  merge(self,l1,l2):
        if not l1:
            return l2
        if not l2:
            return  l1
        dummy=ListNode(0)
        p=dummy
        while l1 and l2:
            if l1.val<l2.val:
                p.next=l1
                l1=l1.next
            else:
                p.next=l2
                l2=l2.next
            p=p.next
        if l1:
            p.next=l1
        else:
            p.next=l2
        return dummy.next    
    def sortList(self, head):
        if not head or not head.next:
            return head
        dummy=ListNode(0)
        dummy.next=head
        fast=slow=dummy
        while fast.next and fast.next.next:
            slow=slow.next
            fast=fast.next.next
        l1=self.sortList(slow.next)
        slow.next=None
        l2=self.sortList(dummy.next)
        return self.merge(l1,l2)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值