leetcode-109-Convert-Sorted-List-to-Binary-Search-Tree
题目描述(中等难度)
和 “>108 题 吧,算法的关键是取到中间的数据做为根节点。而这里链表的话,由于不支持随机访问,所以会麻烦些。最简单的思路就是我们把链表先用线性表存起来,然后题目就转换成 108 题了。
为了方便,把上一道题的数组参数改为List
。
public TreeNode sortedListToBST(ListNode head) {
ArrayList<Integer> nums = new ArrayList<>();
while (head != null) {
nums.add(head.val);
head = head.next;
}
return sortedArrayToBST(nums);
}
public TreeNode sortedArrayToBST(ArrayList<Integer> nums) {
return sortedArrayToBST(nums, 0, nums.size());
}
private TreeNode sortedArrayToBST(ArrayList<Integer> nums, int start, int end) {
if (start == end) {
return null;
}
int mid = (start + end) >>> 1;
TreeNode root = new TreeNode(nums.get(mid));
root.left = sortedArrayToBST(nums, start, mid);
root.right = sortedArrayToBST(nums, mid + 1, end);
return root;
}
时间复杂度:O(log(n))
。
空间复杂度:数组进行辅助,O(n)
。
解法二
参考 “>108 题 是一样的。
public TreeNode sortedListToBST(ListNode head) {
return sortedArrayToBST(head, null);
}
private TreeNode sortedArrayToBST(ListNode head, ListNode tail) {
if (head == tail) {
return null;
}
ListNode fast = head;
ListNode slow = head;
while (fast != tail && fast.next != tail) {
slow = slow.next;
fast = fast.next.next;
}
TreeNode root = new TreeNode(slow.val);
root.left = sortedArrayToBST(head, slow);
root.right = sortedArrayToBST(slow.next, tail);
return root;
}
时间复杂度:根据递归式可知,T(n) = 2 * T(n / 2 ) + n
,O(nlog(n))
。
空间复杂度:O(log(n))
。
解法三
看完两件小事
如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:
- 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
- 关注公众号 「方志朋」,公众号后台回复「666」 免费领取我精心整理的进阶资源教程
本文著作权归作者所有,如若转载,请注明出处
转载请注明:文章转载自「 Java极客技术学习 」https://www.javajike.com