[LeetCode] 109. Convert Sorted List to Binary Search Tree_Medium tag: Linked List
2019-05-06 05:00 Johnson_强生仔仔 阅读(274) 评论(0) 编辑 收藏 举报Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.
For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never differ by more than 1.
Example:
Given the sorted linked list: [-10,-3,0,5,9], One possible answer is: [0,-3,9,-10,null,5], which represents the following height balanced BST: 0 / \ -3 9 / / -10 5
这个题目可以利用divide and conquer的办法, 先将head 这个list的中点的前一个点找到,然后分别recursive得去判断左边的list 和右边的list,最后将中间的点作为Tree node,然后加起来即可。
T: O(n * lg(n)) # 因为是要找到中点的前一个点,所以需要用dummy node, 然后将slow 和fast 指针都移到 dummy,而不是head
code
# 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: ListNode) -> TreeNode: if not head: return if not head.next: return TreeNode(head.val) dummy = ListNode(0) dummy.next = head while fast: if not fast.next or not fast.next.next: middle = slow.next slow.next = None break slow = slow.next fast = fast.next.next treeHead = TreeNode(middle.val)
slow.next = None treeHead.left = self.sortedListToBST(head) treeHead.right = self.sortedListToBST(middle.next) return treeHead
Code:
# 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: ListNode) -> TreeNode: if not head: return if not head.next: return TreeNode(head.val) left_tail = self.findMiddle(head) rootNode = left_tail.next right = rootNode.next rootNode.next = None left_tail.next = None root = TreeNode(rootNode.val) root.left = self.sortedListToBST(head) root.right = self.sortedListToBST(right) return root def findMiddle(self, head: 'ListNode') -> 'ListNode': dummy = ListNode() dummy.next = head slow, fast = dummy, dummy while fast: if not fast.next or not fast.next.next: return slow slow = slow.next fast = fast.next.next