注意最重要的就是如何寻找到最中间的那个node,用一个fast和slow就可以快速定位
O(n)
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def sortedListToBST(self, head):
"""
:type head: ListNode
:rtype: TreeNode
"""
# recursively
if not head:
return
if not head.next:
return TreeNode(head.val)
# here we get the middle point,
# even case, like '1234', slow points to '2',
# '3' is root, '12' belongs to left, '4' is right
# odd case, like '12345', slow points to '2', '12'
# belongs to left, '3' is root, '45' belongs to right
slow, fast = head, head.next.next
while fast and fast.next:
fast = fast.next.next
slow = slow.next
# tmp points to root
tmp = slow.next
# cut down the left child
slow.next = None
root = TreeNode(tmp.val)
root.left = self.sortedListToBST(head)
root.right = self.sortedListToBST(tmp.next)
return root