[leetcode]Python實現-148.排序連結串列
阿新 • • 發佈:2019-01-28
148.排序連結串列
描述
在 O(n log n) 時間複雜度和常數級空間複雜度下,對連結串列進行排序。
示例
輸入: 4->2->1->3
輸出: 1->2->3->4
輸入: -1->5->3->4->0
輸出: -1->0->3->4->5
思路:
這就需要分析一下各個排序演算法的複雜度了。時間複雜度在O(nlogN)的排序演算法是快速排序,堆排序,歸併排序。但是快排的最壞時間複雜度是O(n^2),平均時間複雜度為O(nlogn),所以不考慮快速排序。而堆排序太繁瑣了。。。。。emmm。。。生硬地排除了。對於陣列來說佔用的空間複雜度為O(1),O(n),O(n)。但是對於連結串列來說使用歸併排序佔用空間為O(1).
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def sortList(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
if head is None or head.next is None:
return head
mid = self.get_mid(head)
l = head
r = mid.next
mid.next = None
return self.merge(self.sortList(l), self.sortList(r))
def merge(self, p, q):
tmp = ListNode(0)
h = tmp
while p and q:
if p.val < q.val:
h.next = p
p = p.next
else:
h.next = q
q = q.next
h = h.next
if p:
h.next = p
if q:
h.next = q
return tmp.next
def get_mid(self, node):
if node is None:
return node
fast = slow = node
while fast.next and fast.next.next:
slow = slow.next
fast = fast.next.next
return slow
這題前前後後拖了兩週了吧,因為各種亂七八糟的事。這一題反覆看了好多版本的程式碼,難點在與連結串列的操作,比如使用快慢指標找到連結串列中點,需要對中點前一個連結串列進行割斷處理。合併兩個有序連結串列,引入一個新的變數來儲存合併結果。
分解子問題,解決子問題,合併問題的解。