diff --git a/0148-sort-list/0148-sort-list.py b/0148-sort-list/0148-sort-list.py new file mode 100644 index 0000000..7b2e96a --- /dev/null +++ b/0148-sort-list/0148-sort-list.py @@ -0,0 +1,53 @@ +# 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