Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.
可以把链表的数取出来变成数组,按照<<Convert Sorted Array to Binary Search Tree>>的办法处理
public class Solution {
public TreeNode sortedListToBST(ListNode head)
{
int[] nums=new int[30000];
int cnt=0;
while(head!=null)
{
nums[cnt++]=head.val;
head=head.next;
}
return sortedArrayToBST(nums, cnt);
}
private TreeNode sortedArrayToBST(int[] nums,int len)
{
if (len == 0)
return null;
return build(0, len - 1, nums);
}
private TreeNode build(int start, int end, int[] nums)
{
if (start == end)
return new TreeNode(nums[start]);
if (start > end)
return null;
int mid = (start + end) >> 1;
int num = nums[mid];
TreeNode t = new TreeNode(num);
t.left = build(start, mid - 1, nums);
t.right = build(mid + 1, end, nums);
return t;
}
}
另外不取出来直接处理的版本
https://discuss.leetcode.com/topic/8141/share-my-o-1-space-and-o-n-time-java-code/2
private ListNode node;
public TreeNode sortedListToBST(ListNode head) {
if(head == null){
return null;
}
int size = 0;
ListNode runner = head;
node = head;
while(runner != null){
runner = runner.next;
size ++;
}
return inorderHelper(0, size - 1);
}
public TreeNode inorderHelper(int start, int end){
if(start > end){
return null;
}
int mid = start + (end - start) / 2;
TreeNode left = inorderHelper(start, mid - 1);
TreeNode treenode = new TreeNode(node.val);
treenode.left = left;
node = node.next;
TreeNode right = inorderHelper(mid + 1, end);
treenode.right = right;
return treenode;
}