Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.
用start和end两个point来记录当前的sublist,每次取中间值create new TreeNode后,用递归分别创建left subtree和right subtree。
值得注意的是这条语句:root.right = helper(run.next,0,end-mid-1)
之前我用的是root.right = helper(head, mid+1, end),意味着对于每次寻找sublist的中间节点,都要从头开始遍历,结果超时了,稍微改动一下即可。
另外还有个地方没想明白,第一次做这题的时候,没有用两个point,想到的是每次遍历sublist,找到中间节点,然后切断中间节点和前一个节点间的链接,例如: 1->2->3,遍历list找到中间节点为2,然后设置1.next=null,同样用递归root.left = fun(1), root.right = fun(3),可是问题是,为了切断1和2之间的链接,每次要找的实际是中间节点的前一个节点,结果各种corner case出错,比如只有1个节点怎么办,只有两个怎么办,等等。。最后索性放弃,不过这个方法应该是可行的,下次再试试。
public TreeNode sortedListToBST(ListNode head) {
if(head==null)
return null;
int len = 0;
ListNode run = head;
while(run!=null){
run=run.next;
len++;
}
return helper(head, 0, len-1);
}
public TreeNode helper(ListNode head,int start, int end){
if(start>end)
return null;
int mid = (start+end)/2, cnt = 0;
ListNode run = head;
while(cnt < mid){
run = run.next;
cnt++;
}
TreeNode root = new TreeNode(run.val);
root.left = helper(head, start,mid-1);
root.right = helper(run.next,0,end-mid-1);
return root;
}