在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。
示例 1:
输入: 4->2->1->3 输出: 1->2->3->4
示例 2:
输入: -1->5->3->4->0 输出: -1->0->3->4->5
# 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:
res = []
while head:
res.append(head.val)
head = head.next
res.sort()
p = dummy = ListNode(None)
for i in res:
p.next = ListNode(i)
p = p.next
return dummy.next
# 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:
def getMiddle(h:ListNode):
if h.next:
slow,fast = h,h.next
while fast.next:
slow = slow.next
fast = fast.next.next
if not fast:
return slow
return slow
else:
return h
def mergeTwoSortedLists(l1,l2):
dummy = pre = ListNode(0)
while l1 and l2:
if l1.val < l2.val:
pre.next = l1
l1 = l1.next
else:
pre.next = l2
l2 = l2.next
pre = pre.next
pre.next = l1 or l2
return dummy.next
def mergeSort(node):
if not node:
return None
if not node.next:
return node
if not node.next.next:
if node.val > node.next.val:
node.val,node.next.val = node.next.val,node.val
return node
else:
midpre = getMiddle(node)
middle,midpre.next = midpre.next,None
return mergeTwoSortedLists(mergeSort(middle),mergeSort(node))
return mergeSort(head)