题目描述:完成链表的排序,在
nlogn
时间复杂度内,且只用常数空间。
题目链接:148. Sort List
这题思路要求要用nlogn
的时间复杂度的算法去完成这个操作,其实选择也就那么多:
1、快排
2、堆排
3、归并排序
在数组上完成这三个操作其实都不太难,但在链表上有一定难度。快排要找到pivot然后比较交换,双向链表比较合适,堆排要放到数组建堆,不满足。归并排序,在数组的情况下需要建立一个新的数组装填新的元素顺序,在链表的情况下只需要改变链表指向就可以了。
用到核心是快慢指针分成两半、递归划分然后再合并。
代码实现如下:
class Solution:
def merge(self,h1,h2):
dummy = tail = ListNode(None)
while h1 and h2:
if h1.val < h2.val:
tail.next, tail, h1 = h1, h1, h1.next
else:
tail.next, tail, h2 = h2, h2, h2.next
tail.next = h1 or h2
return dummy.next
def sortList(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
if not head or not head.next: #当只剩下一个元素的时候就返回
return head
pre, slow, fast = None, head, head
while fast and fast.next:
pre, slow, fast = slow, slow.next, fast.next.next
pre.next = None #分两半
left = self.sortList(head)
right = self.sortList(slow)
return self.merge(left,right)
当然也有非常作弊的实现,利用列表存储,然后排序,再建立新的链表。