Files
leetcode/0148-sort-list/0148-sort-list.py
T

54 lines
1.8 KiB
Python

# 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]:
# Base case: len <= 2
if head == None or head.next == None:
return head
elif head.next.next == None:
if head.val > head.next.val:
large = head
small = head.next
small.next = large
large.next = None
return small
return head
# Find middle node
mid = head
end = head.next
while end.next is not None and end.next.next is not None:
mid = mid.next
end = end.next.next
# Detach lists
secondHead = mid.next
mid.next = None
# Merge two sorted linked lists
sortedLeft = self.sortList(head)
sortedRight = self.sortList(secondHead)
isLeftLower = sortedLeft.val < sortedRight.val
mergeHead = sortedLeft if isLeftLower else sortedRight
currentHead = mergeHead
sortedLeft = sortedLeft.next if isLeftLower else sortedLeft
sortedRight = sortedRight if isLeftLower else sortedRight.next
while sortedLeft is not None and sortedRight is not None:
isLeftLower = sortedLeft.val < sortedRight.val
lowestNode = sortedLeft if isLeftLower else sortedRight
sortedLeft = sortedLeft.next if isLeftLower else sortedLeft
sortedRight = sortedRight if isLeftLower else sortedRight.next
currentHead.next = lowestNode
currentHead = currentHead.next
currentHead.next = sortedLeft if sortedLeft is not None else sortedRight
return mergeHead