题目地址:
https://www.lintcode.com/problem/convert-sorted-list-to-binary-search-tree/description
给定一个有序的链表,要求返回由其节点值构成的Balanced BST。
思路是,先找到链表的中点,然后将整个链表分成三个部分,分别是中点左边的部分,中点自己和中点右边的部分,先建树根,再递归建左右子BST,然后连到树根上即可。代码如下:
public class Solution {
/*
* @param head: The first node of linked list.
* @return: a tree node
*/
public TreeNode sortedListToBST(ListNode head) {
// write your code here
if (head == null) {
return null;
}
ListNode dummy = new ListNode(0);
dummy.next = head;
// 寻找链表的中点。最后的效果是,
// slow在链表中点(如果是偶数个节点,则在中点偏左边),
// prev是slow之前那个节点
ListNode slow = dummy, fast = dummy, prev = dummy;
while (fast != null && fast.next != null) {
if (slow != dummy) {
prev = prev.next;
}
fast = fast.next.next;
slow = slow.next;
}
// 将中点与前半部分链表断开,然后开始建树
prev.next = null;
TreeNode root = new TreeNode(slow.val);
root.left = sortedListToBST(dummy.next);
root.right = sortedListToBST(slow.next);
return root;
}
}
class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
class TreeNode {
int val;
TreeNode left, right;
TreeNode(int x) {
val = x;
}
}
时间复杂度 O ( n log n ) O(n\log n) O(nlogn),空间 O ( h ) O(h) O(h)。时间复杂度可由 T ( n ) = O ( n ) + 2 T ( n 2 ) T(n)=O(n)+2T(\frac{n}{2}) T(n)=O(n)+2T(2n)得到。