此题是经典的链表排序题,链表排序,由于它只能从前向后遍历的特性,很多排序都不能用。
比如快速排序,首先找pivot就得遍历一遍,在递归时还需要交换元素,链表交换一个元素可是相当麻烦,递归过程中也会遇到问题,比如新链表头比较难换等。总之,如果用递归做排序,会非常的复杂,有很多细节要处理。
此题中用到的归并排序,是目前最快(挺快的,不是最快)的一种排序方法,和快速排序类似。如果陷入递归,也是很麻烦,但我们可以采用自底向上的方法进行归并排序,这样还能减少空间复杂度(没有递归栈)代码如下:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
from collections import deque
class Solution:
def sortList(self, head: ListNode) -> ListNode:
if not head: return head
# split linked list
curr = head
q = deque()
while curr:
q.append(curr)
tmp = curr
curr = curr.next
tmp.next = None
def merge(n1, n2):
n = ListNode()
curr = n
while n1 or n2:
if n1 and n2:
if n1.val >= n2.val:
curr.next = n2
n2 = n2.next
else:
curr.next = n1
n1 = n1.next
elif n1:
curr.next = n1
n1 = n1.next
else:
curr.next = n2
n2 = n2.next
curr = curr.next
curr.next = None
return n.next
# sort by bottom-up
while len(q) > 1:
tmp_q = deque()
while len(q) > 1:
n1, n2 = q.popleft(), q.popleft()
n = merge(n1, n2)
tmp_q.append(n)
if len(q) > 0:
tmp_q.append(q[0])
q = tmp_q
return q[0]