動機
merge sort的所有case都是O(nLog(n))!!
Problem
Given the head
of a linked list, return the list after sorting it in ascending order.
Follow up: Can you sort the linked list in O(n logn)
time and O(1)
memory (i.e. constant space)?
Example 1:
Input: head = [4,2,1,3]Output: [1,2,3,4]
Example 2:
Input: head = [-1,5,3,4,0]Output: [-1,0,3,4,5]
Example 3:
Input: head = []Output: []
Constraints:
- The number of nodes in the list is in the range
[0, 5 * 104]
. -105 <= Node.val <= 105
Sol
當初是先用qsort去寫,結果在極端與大的case吃鱉
因為選的pivot通常不是好的,所以吃了一堆TLE
所以要用merge sort
def havle(r):
ptr = r
mid = r
endLeft = None
while ptr and ptr.next:
endLeft = mid
mid = mid.next
ptr = ptr.next.next
right = mid
endLeft.next = None
return [r, right]
def sort(r):
if not r or not r.next:
return r
left, right = havle(r)
left = sort(left)
right = sort(right)
ret = ListNode()
ptr = ret
while left or right:
if left and right:
if left.val <= right.val:
ptr.next = left
left = left.next
else:
ptr.next = right
right = right.next
ptr = ptr.next
elif left:
ptr.next = left
break
else:
ptr.next = right
break
return ret.next
class Solution:
def sortList(self, head: ListNode) -> ListNode:
return sort(head)