1. 程式人生 > >[leetcode]Python實現-148.排序連結串列

[leetcode]Python實現-148.排序連結串列

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

這題前前後後拖了兩週了吧,因為各種亂七八糟的事。這一題反覆看了好多版本的程式碼,難點在與連結串列的操作,比如使用快慢指標找到連結串列中點,需要對中點前一個連結串列進行割斷處理。合併兩個有序連結串列,引入一個新的變數來儲存合併結果。
分解子問題,解決子問題,合併問題的解。