Skip to content

Sorted List To Bst

# dividing the Linked List into 2 parts first half = left Node, middle = root and right = second half.
# To find middle element use 2 pointer approach: slow and fast

# https://leetcode.com/problems/convert-sorted-list-to-binary-search-tree/

# Definition for singly-linked list.
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next


# Definition for a binary tree node.
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right


class Solution:
    def sortedListToBST(self, head):
        if not head:
            return None
        if not head.next:
            return TreeNode(head.val)
        mid = self.getMid(head)
        root = TreeNode(mid.val)
        root.right = self.sortedListToBST(mid.next)
        mid.next = None
        root.left = self.sortedListToBST(head)
        return root

    def getMid(self, head):
        slow, fast = head, head
        prev = None
        while fast and fast.next:
            fast = fast.next.next
            prev = slow  # save
            slow = slow.next
        if prev:
            prev.next = None
        return slow  # mid element