【LeetCode 中等題】70-排序連結串列
阿新 • • 發佈:2019-01-14
題目描述:在 O(n log n) 時間複雜度和常數級空間複雜度下,對連結串列進行排序。
示例 1:
輸入: 4->2->1->3 輸出: 1->2->3->4示例 2:
輸入: -1->5->3->4->0 輸出: -1->0->3->4->5
解法1。歸併排序的遞迴做法,先找到連結串列的中點,然後從中間斷開,然後對前半段和後半段進行歸併排序,斷開這個操作是用遞迴,對前半段遞迴到底,回溯到倒數第二層,再對後半段遞迴到底,再呼叫merge函式。
class Solution(object): def sortList(self, head): """ :type head: ListNode :rtype: ListNode """ if not head or not head.next: return head slow = head pre = head fast = head while fast and fast.next: pre = slow slow = slow.next fast = fast.next.next pre.next = None ''' l = sortList(head) r = sortList(slow) return self.merge(l, r) ''' # 上面這段等價於: return self.merge(self.sortList(head), self.sortList(slow)) def merge(self, l1, l2): if not l1: return l2 if not l2: return l1 if l1.val < l2.val: l1.next = self.merge(l1.next, l2) return l1 else: l2.next = self.merge(l1, l2.next) return l2
解法2。其實是在上述做法的基礎上把merge函式改寫成了用迴圈做,效率提高了不少
class Solution(object): def sortList(self, head): """ :type head: ListNode :rtype: ListNode """ if not head or not head.next: return head slow = head pre = head fast = head while fast and fast.next: pre = slow slow = slow.next fast = fast.next.next pre.next = None return self.merge(self.sortList(head), self.sortList(slow)) def merge(self, l1, l2): if not l1: return l2 if not l2: return l1 dummy = ListNode(0) cur = dummy while l1 and l2: if l1.val < l2.val: cur.next = l1 l1 = l1.next else: cur.next = l2 l2 = l2.next cur = cur.next if l1: cur.next = l1 if l2: cur.next = l2 return dummy.next