148. Sort List

# 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
        """
        if head == None or head.next == None:
            return head
        slow = head
        fast = head
        while fast.next and fast.next.next:
            slow = slow.next
            fast = fast.next.next
        right = slow.next
        left = head
        slow.next = None  # use slow and fast cursor to split into 2 parts
        left = self.sortList(left)
        right = self.sortList(right)
        head = self.merge(left, right)
        return head

    def merge(self, left, right):
        if left == None:
            return right
        if right == None:
            return left
        # O(1) space, insert right into left
        if left.val <= right.val:
            result = left
            left = left.next
        else:
            result = right
            right = right.next
        tmp = result
        while left and right:
            if left.val <= right.val:
                tmp.next = left
                left = left.next
                tmp = tmp.next
            else:
                tmp.next = right
                right = right.next
                tmp = tmp.next
        if left == None:
            tmp.next = right
        if right == None:
            tmp.next = left
        return result

blogroll

social