Problem List

Convert Sorted List To Binary Search Tree

May 30, 2025Go linked list, divide and conquer, binary search treemedium

Problem

Example:

Input: head = [-10,-3,0,5,9]

Output: [0,-3,9,-10,null,5]

Approach

Edge Cases

Reflections

This was my first medium-level problem, and it felt like a solid step up from the easier problems. Having solved 108 recently helped because the approach.

I'm not proud of the performance, beating only 22% on time and 20% on memory. But the extra conversion step from linked list to array paid off in simplicity during the tree construction phase.

I have no doubt there is a version of this that is possible with a slow and fast pointer on the linked list, and I'll try it at some point.

Performance

Complexity

Go Solution
func sortedListToBST(head *ListNode) *TreeNode {
    nums := linkedListToArray(head)
    if len(nums) == 0 {
        return nil
    }

    if len(nums) == 1 {
        return &TreeNode{Val:nums[0]}
    }
    
    mid := len(nums)/2

    node := &TreeNode{Val:nums[mid]}

    leftArr := nums[:mid]
    rightArr := nums[mid+1:]

    node.Left = insert(leftArr)
    node.Right = insert(rightArr)

    return node
}

func insert(nums []int) *TreeNode {
     if len(nums) == 0 {
        return nil
    }

    if len(nums) == 1 {
        return &TreeNode{Val:nums[0]}
    }
 
    mid := len(nums)/2

    node := &TreeNode{Val:nums[mid]}

    leftArr := nums[:mid]
    rightArr := nums[mid+1:]

    node.Left = insert(leftArr)
    node.Right = insert(rightArr)

    return node

}

func linkedListToArray(node *ListNode) []int {
    var nums []int

    for node != nil {
        nums = append(nums,node.Val)
        node = node.Next    
    }

    return nums
}
LeetCode Problem Link