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))