[leetcode] convert sorted list to binary search

题目不赘述了,应室友要求,把这个题目又重新写了一遍

大多数人的做法是把list转成vector,这样的话,用递归直接就搞定了,很直观。

如果给定O(1)的空间复杂度的话,这样的做法就不可以了。我以前的做法是每次都要去找list的中间值,显然这样是不妥的。看了discuss才发现了一个灰常tricky的方法:按照中序遍历的方法去建树,这样保证访问list的顺序是从头到尾的,所以只需要设定一个全局变量,每次mid = mid->next就可以了。这也叫bottom-up的方法。

class Solution { 
    ListNode *list; 
public: 
    TreeNode *sortedListToBST(ListNode *head) { 
        // Start typing your C/C++ solution below 
        // DO NOT write int main() function 
        ListNode *p = head; 
        int n = 0; 
        while(p){ 
            p = p->next; 
            n++; 
        } 
         
        list = head; 
        return foo(0, n-1); 
         
    } 
     
    TreeNode* foo(int start, int end) { 
        
       if (start > end) return NULL; 
        int mid = start + (end - start) / 2; 
         
        TreeNode *leftChild = foo(start, mid-1); 
        TreeNode *root = new TreeNode(list->val); 
         
        root->left = leftChild; 
        list = list->next; 
        root->right = foo(mid+1, end); 
         
        return root; 
    } 
  
   
}; 


你可能感兴趣的:(LeetCode)