比较直观的解法是自顶向下的递归解决,先找到中间节点作为根节点,然后递归左右两部分。所以我们需要先找到中间节点,题目中要求如果链表结点数为偶,则中间结点为两个中间结点的后一个。对于单链表来说,必须要遍历一边,可以使用快慢指针加快查找速度。
代码如下:
public TreeNode sortedListToBST(ListNode head) {
if(head == null)
return null;
if(head.next == null){
return new TreeNode(head.val);
}
//用快慢指针找到中间节点
ListNode slow = head;
ListNode fast = head;
ListNode preSlow = null;
while(fast!= null&&fast.next!=null){
preSlow = slow;
slow = slow.next;
fast = fast.next;
if(fast!=null&&fast.next!=null)
{
fast=fast.next;
}
}
//分别递归左右两部分
TreeNode mid = new TreeNode(slow.val);
if(preSlow != null){
preSlow.next = null;
mid.left = sortedListToBST(head);
}
if(slow.next != null){
mid.right = sortedListToBST(slow.next);
}
return mid;
}
本文详细介绍了如何将一个有序链表转换为平衡二叉搜索树的过程,采用自顶向下的递归方法,利用快慢指针找到中间节点作为根节点,并递归地处理左右两部分链表。
1312

被折叠的 条评论
为什么被折叠?



