[leetcode] convert sorted list to binary search

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

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

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

  
  
  
  
  1. class Solution { 
  2.     ListNode *list; 
  3. public
  4.     TreeNode *sortedListToBST(ListNode *head) { 
  5.         // Start typing your C/C++ solution below 
  6.         // DO NOT write int main() function 
  7.         ListNode *p = head; 
  8.         int n = 0; 
  9.         while(p){ 
  10.             p = p->next; 
  11.             n++; 
  12.         } 
  13.          
  14.         list = head; 
  15.         return foo(0, n-1); 
  16.          
  17.     } 
  18.      
  19.     TreeNode* foo(int start, int end) { 
  20.         
  21.        if (start > end) return NULL; 
  22.         int mid = start + (end - start) / 2; 
  23.          
  24.         TreeNode *leftChild = foo(start, mid-1); 
  25.         TreeNode *root = new TreeNode(list->val); 
  26.          
  27.         root->left = leftChild; 
  28.         list = list->next; 
  29.         root->right = foo(mid+1, end); 
  30.          
  31.         return root; 
  32.     } 
  33.   
  34.    
  35. }; 

 

你可能感兴趣的:(LeetCode)