问题描述:
/** * Given a singly linked list where elements are sorted in ascending order, * convert it to a height balanced BST. */
给你一个升序的单链表来构造一个平衡二叉树。这个题目和上面那篇博文不一样在上面那篇博文是给了一个升序的数组,而这次是单链表。
解题思路依然是先找到其根节点。由于前面那道题目给的是升序的数组,所以其根节点很好找就是中间的节点,即mid=(start + end) / 2;但是单链表没有下标,如何每次递归找其中间的节点呢?
用双指针法。具体来说就是,有两个指针,一个指针fast每次走两步,一个指针slow每次走一步,当fast指针走完时,说明slow指针正好走到了一半。用这样的方法就可以找到单链表的中间节点。具体代码如下:
public TreeNode sortedListToBST(ListNode head) {
return sortedListToBST(head, null);
}
private TreeNode sortedListToBST(ListNode start, ListNode end) {
if (start == end) {
return null;
} else if (start.next == end) {
return new TreeNode(start.val);
} else {
ListNode fast = start, slow = start;
while (fast.next != end && fast.next.next != end) {
fast = fast.next.next;
slow = slow.next;
}
TreeNode left = sortedListToBST(start, slow);
TreeNode right = sortedListToBST(slow.next, end);
TreeNode root = new TreeNode(slow.val);
root.left = left;
root.right = right;
return root;
}
}