Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.
Solution1:
自顶向下构建BST。不足之处是每次构建节点都要遍历寻找中间节点。
public TreeNode sortedListToBST(ListNode head) {
return toBST(head, null);
}
public TreeNode toBST(ListNode head, ListNode end) {
if(head == end) return null;
ListNode mid = findMidNode(head, end);
TreeNode node = new TreeNode(mid.val);
node.left = toBST(head, mid);
node.right = toBST(mid.next, end);
return node;
}
public ListNode findMidNode(ListNode head, ListNode end) {
if(head==end || head.next==end) return head;
ListNode walker = head, runner = head;
while(runner != end && runner.next!=end) {
walker = walker.next;
runner = runner.next.next;
}
return walker;
}
Solution2:
这个办法更好。自底向上构建BST。不用每次寻找中间节点了,直接顺序访问链表。
private ListNode h;
public TreeNode sortedListToBST(ListNode head) {
if(head == null) return null;
h = head;
int len = 1;
ListNode node = head;
while((node=node.next)!=null) len++;
return toBST(0, len-1);
}
public TreeNode toBST(int start, int end) {
if(start > end) return null;
int m = (start+end)>>1;
TreeNode left = toBST(start, m-1);
TreeNode root = new TreeNode(h.val);
h = h.next;
TreeNode right = toBST(m+1, end);
root.left = left;
root.right = right;
return root;
}