LeetCode 148 [Sort List]

作者: Jason_Yuan | 来源:发表于2016-06-13 15:54 被阅读239次

    原题

    在 O(n log n) 时间复杂度和常数级的空间复杂度下给链表排序。

    样例给出 1->3->2->null,给它排序变成 1->2->3->null.

    解题思路

    • 方法一:遍历链表,存入数组中,排序数组,然后重新构建链表
    • 方法二:直接操作链表,Merge Sort,先局部有序再整体有序,找中点,然后左半部分和右半部分分别递归merge sort (Divide and Conquer)
    • 总结:
    • 对于数组,quick sort好于merge sort,因为quick sort是in-place,而merge sort需要额外空间,开辟空间/回收空间都要耗费时间
    • 对于链表,merge sort并不需要额外空间

    完整代码

    # Definition for singly-linked list.
    # class ListNode(object):
    #     def __init__(self, x):
    #         self.val = x
    #         self.next = None
    
    # 方法一
    class Solution(object):
        def sortList(self, head):
            """
            :type head: ListNode
            :rtype: ListNode
            """
            ans = []
            tmp = head
            while tmp != None:
                ans.append(tmp.val)
                tmp = tmp.next
    
            ans.sort()
            tmp = head
            for i in ans:
                tmp.val = i
                tmp = tmp.next
            return head
    
    # 方法二
    class Solution(object):
        def sortList(self, head):
            """
            :type head: ListNode
            :rtype: ListNode
            """
            if head == None or head.next == None:
                return head
    
            mid = self.findMiddle(head)
    
            right = self.sortList(mid.next)
            mid.next = None
            left = self.sortList(head)
    
            return self.merge(left, right)
            
        def findMiddle(self, head):
            slow, fast = head, head.next
            while fast != None and fast.next != None:
                fast = fast.next.next
                slow = slow.next
            return slow    
    
        def merge(self, head1, head2):
            dummy = ListNode(0)
            head = dummy
            while head1 and head2:
                if head1.val < head2.val:
                    head.next = head1
                    head1 = head1.next
                else:
                    head.next = head2
                    head2 = head2.next
                head = head.next
            if head1:
                head.next = head1
            if head2:
                head.next = head2
            return dummy.next
    

    相关文章

      网友评论

        本文标题:LeetCode 148 [Sort List]

        本文链接:https://www.haomeiwen.com/subject/wzuydttx.html