Sort List

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

分析

mergesort 注意快慢指针结束,slow在中偏后

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def sortList(self, head: ListNode) -> ListNode:
        if not head or not head.next:
            return head
        slow = quick = head        
        pre = None
        while quick and quick.next:
            pre = slow
            slow = slow.next
            quick = quick.next.next
           
        
        pre.next = None        
        lh = self.sortList(head)
        rh = self.sortList(slow)
        
        p = res = ListNode(-1)
        
        while lh and rh:
            if lh.val < rh.val:
                res.next = lh
                lh = lh.next
            else:
                res.next = rh
                rh = rh.next
            res = res.next
        if lh:
            res.next = lh
        if rh:
            res.next = rh      
        
        return p.next
        
        
        
        
        

recursive

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def sortList(self, head: ListNode) -> ListNode:
        if not head or not head.next:
            return head
        slow = quick = head        
        pre = None
        while quick and quick.next:
            pre = slow
            slow = slow.next
            quick = quick.next.next
           
        
        pre.next = None        
        lh = self.sortList(head)
        rh = self.sortList(slow)
        
        def merge(l,r):
            if not l:
                return r
            if not r:
                return l
            res = None
            
            if l.val < r.val:
                res = l
                res.next = merge(l.next,r)
            else:
                res = r
                res.next = merge(l,r.next)
            return res
        
                    
        
        return merge(lh,rh)
        
        
        
        
        
        

Last updated