109 Convert Sorted List to Binary Search Tree题目链接
核心: 快慢指针
快慢指针的使用方法可参考该博客:快慢指针法玩转链表算法面试
本题方便在已经给出了排好序的链表,那么只需要逐个递归进行二分成树即可。
一开始小李看到AVL tree时候第一想法是通过逐个插入构建AVL tree,无奈懒得将AVL tree的旋转写一遍(而且,调整平衡的时候需要考虑树的高度,but definition for a binary tree node 并没有给树的高度,小李懒得解决了),so,写了下面这个东西出来。
class Solution {
public:
TreeNode* sortedListToBST(ListNode* head) {
ListNode* tail = nullptr;
return BST(head, tail);
}
TreeNode* BST(ListNode* head, ListNode* tail){
if(head == nullptr) return nullptr;//链表为空情况
if(head->next == nullptr) return new TreeNode(head->val); //链表只有一个值
ListNode *start = new ListNode(0);
start->next = head;
//这里注意一下, 一开始我没有想设置start 直接上来就fast slow = head 跑的时候出现了和预期答案不服的情况 eg: [1,2] 我的输出[2,1] 预期[1,null,2]
ListNode *fast = start, *slow = start, *preSlow = nullptr;
while((fast != nullptr) && (fast->next != nullptr)){
preSlow = slow;
slow = slow->next;
fast = (fast->next)->next;
}
TreeNode* root = new TreeNode(slow->val);
preSlow->next = nullptr;
root->left = BST(start->next, tail);
root->right = BST(slow->next, tail);
return root;
}
};