148. 链表排序

Sort a linked list in O(n log n) time using constant space complexity.
Example 1:

Input: 4->2->1->3
Output: 1->2->3->4

Example 2:

Input: -1->5->3->4->0
Output: -1->0->3->4->5

思路

  1. 归并排序
    def sortList(self, head: ListNode) -> ListNode:
        def mergeTwoList(L1, L2):
            if not L1:
                return L2
            if not L2:
                return L1
            newHead = ListNode(0)
            L3 = newHead
            while L1 and L2:
                if L1.val < L2.val:
                    L3.next = L1
                    L1 = L1.next
                else:
                    L3.next = L2
                    L2 = L2.next
                L3 = L3.next
            if L1:
                L3.next = L1
            else:
                L3.next = L2
            return newHead.next

        if not head or not head.next:
            return head
        slow = head
        quick = head
        while quick.next and quick.next.next:
            slow = slow.next
            quick = quick.next.next
        right = slow.next
        slow.next = None
        left = self.sortList(head)
        right = self.sortList(right)
        return mergeTwoList(left, right)
  1. 快排
    def sortList2(self, head: ListNode) -> ListNode:
        def partition(head, end):
            if not head or not end or head == end:
                return
            l1 = head
            l2 = head.next
            pivot = head.val
            while l2 != end.next and l2:
                if l2.val < pivot:
                    l1 = l1.next
                    if l1 != l2:
                        tmp = l1.val
                        l1.val = l2.val
                        l2.val = tmp
                l2 = l2.next
            if head != l1:
                tmp = l1.val
                l1.val = head.val
                head.val = tmp
            return l1
        def sortHelper(head, end):
            if not head or not end or head == end:
                return
            node = partition(head, end)
            sortHelper(head, node)
            sortHelper(node.next, end)
            return head

        if not head or not head.next:
            return head
        end = head
        while end.next:
            end = end.next

        new_head = sortHelper(head, end)
        return new_head
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 题目链接tag: Medium; question  Sort a linked list in O(n log ...
    xingzai阅读 2,865评论 1 0
  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi阅读 12,140评论 0 10
  • 1. Merge Sorted Array Description: Easy Given two sorted ...
    BookThief阅读 12,742评论 0 2
  • 每天努力地忙碌,用力地生活,却总在不知不觉间遗失了什么,有时候,我们需要的只是一颗静下来的心。独处也是一种享受,在...
    凤玲走天涯阅读 1,664评论 0 7
  • 在前端领域中,我们经常会有到各种图片来摆脱黑白的网页界面,让网页变得更加生动有趣,但是要是我们要加入各种图标样式的...
    子龙爱弹琴阅读 3,355评论 0 1