class Solution {
public:
TreeNode* sortedListToBST(ListNode* head) {
if(!head) return nullptr;
if(!head->next) return new TreeNode(head->val);
ListNode* slow = head;
ListNode* fast = head;
ListNode* last = slow;
while(fast->next && fast->next->next){
last = slow;
slow = slow->next;
fast = fast->next->next;
}
fast = slow->next; //must before the next line since last and slow may be the same node
last->next = NULL;
TreeNode* cur = new TreeNode(slow->val);
if(head!=slow) cur->left = sortedListToBST(head);
cur->right = sortedListToBST(fast);
return cur;
}
};
基本循环(>=3 nodes):
1. 中间数为root
2. 将原数据分成两段:前半段为left substree, 后半段为right subtree
没有node、一个node情况被开头的两个if statement handle
两个nodes的时候,slow=last=head 成为root, fast=slow->next成为right