148. Sort List

Sort List - LeetCode

Given the head of a linked list, return the list after sorting it in ascending order.

Example 1: Input: head = [4,2,1,3] Output: [1,2,3,4] Example 2: Input: head = [-1,5,3,4,0] Output: [-1,0,3,4,5] Example 3: Input: head = [] Output: []

Constraints:

The number of nodes in the list is in the range [0, 5 * 104].
-105 <= Node.val <= 105

  • code #mergeSort
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def sortList(self, head: Optional[ListNode]) -> Optional[ListNode]:
        def merge(list1, list2):
            ans = cur = ListNode()
            while list1 and list2:
                if list1.val <= list2.val:
                    cur.next, list1 = list1, list1.next
                else:
                    cur.next, list2 = list2, list2.next
                cur = cur.next
            cur.next = list1 or list2
            return ans.next
        
        if not head or not head.next: return head
        
        fast = head 
        slow = ListNode(0, head)
        while fast and fast.next:
            slow = slow.next
            fast = fast.next.next
        second = slow.next
        slow.next = None
        
        return merge(self.sortList(head), self.sortList(second))