题目:
给定一个单链表,其中的元素按升序排序,请将它转化成平衡二叉搜索树(BST)
思路:递归,通过快慢指针求出middle,可以通过额外一个指针,每次都比middle慢一拍,拿到midlle前面的节点。注意这里的middle一定要是一半或一半+/-1。在本题的解法中middle等于恰好中间节点或者第len/2+1个节点。如何得到这个结论?只需要这样考虑,初始时,slow为head, fast为head。然后,slow每走一步,奇数情况下,fast刚好能走到最后一个节点,此时slow刚好落在中间节点,偶数情况下,只需将其看成奇数情况加1的情况。例如,len为5的话,slow最终为3,len为6的话,slow最终为4。
public TreeNode sortedListToBST(ListNode head){
if(head==null) return null;
if(head.next==null) return new TreeNode(head.val);
ListNode mid=head;
ListNode end=head;
ListNode preMid=null;
while(end!=null&&end.next!=null){
preMid=mid;
mid=mid.next;
end=end.next.next;
}
TreeNode root=new TreeNode(mid.val);
preMid.next=null;
root.left=sortedListToBST(head);
root.right=sortedListToBST(mid.next);
return root;
}