Leetcode-109.有序链表转换为二叉搜索树

题目描述

给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。

本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。

示例:

给定的有序链表: [-10, -3, 0, 5, 9],

一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树:

      0
     / \
    -3   9
   /   /
 -10  5

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/convert-sorted-list-to-binary-search-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法1:快慢指针

由于是链表我们不能直接获得中间数所在的位置,所以我们创建一个快慢指针,前指针移动两次,后指针移动一次,后指针也就能刚好到中间位置,其余与108题解题思路一样,同样是递归,二分

注意代码中的一些小细节,特殊处理一下当前后指针没有动的情况

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Solution {
public:
TreeNode* sortedListToBST(ListNode* head) {
return find(head,head);
}
TreeNode *find(ListNode *p1,ListNode *head)
{
if(p1==NULL)
return NULL;
ListNode *lefts=p1;
ListNode *p2=p1->next;
ListNode *p=new ListNode(-1);
while(p2!=NULL)
{
p=p1;
p1=p1->next;

p2=p2->next;
if(p2==NULL)
break;
p2=p2->next;
}
TreeNode *root=new TreeNode(p1->val);
if(p1==lefts)
lefts=NULL;

p->next=NULL;
root->left=find(lefts,head);
root->right=find(p1->next,head);
return root;
}
};

时间复杂度:O(nlogn)

解法2:转换为数组

直接遍历一遍链表创建一个新的数组,对数组进行操作,也就与108题完全一样了