给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树
解题思路
与上一题基本一致
不同的是上一题中索引找出中间元素,这题用快慢指针找出中间元素
快指针一次往后迭代两个节点,慢指针一次一个,当快指针到达末尾时,慢指针指向中间元素
代码
class Solution {
public TreeNode sortedListToBST(ListNode head) {
if (head == null) {
return null;
}
if (head.next == null) {
return new TreeNode(head.val);
}
// 快慢指针找中间元素
ListNode pre = null;
ListNode slow = head;
ListNode quick = head;
while (quick != null && quick.next != null) {
pre = slow;
slow = slow.next;
quick = quick.next.next;
}
pre.next = null; // 注意要断开
TreeNode root = new TreeNode(slow.val);
root.left = sortedListToBST(head);
root.right = sortedListToBST(slow.next);
return root;
}
}