题目:
在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。
本题的重点在于,时间复杂度和空间复杂度的限制
题解:
链表的优势在于可以通过修改引用来更改节点顺序,无需开辟额外空间,而已循环交换。
题解采用了归并排序的方法,通过不断二分排序再合并的方法,实现了O(nlogn)的时间复杂度和O(1)的空间复杂度
下图来自LeetCode网站题解:
链接:https://leetcode-cn.com/problems/sort-list/solution/sort-list-gui-bing-pai-xu-lian-biao-by-jyd/
参照这个思想,代码实现如下:
#!/usr/bin/env python3.6
# _*_coding:utf-8 _*_
# @Time : 2019/10/30 16:06
# @Author : Grey
# Definition for singly-linked list.
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
def sortList(self, head: ListNode) -> ListNode:
if not head or not head.next:
return head
fast, slow = head.next, head
while fast.next and slow:
fast, slow = fast.next.next, slow.next
fast = slow.next
slow.next = None
slow = head
left, right = self.sortList(self, slow), self.sortList(self, fast)
res = h = ListNode(0)
while left and right:
if left.val <= right.val:
h.next = left
left = left.next
else:
h.next = right
right = right.next
h = h.next
h = left if left else right
res = res.next
return res