TreeNode* sortedListToBST(ListNode* head) {
        if (head == nullptr) return nullptr;

        vector<int> nums;
        while (head != nullptr)
        {
            nums.emplace_back(head->val);
            head = head->next;
        }

        std::function<TreeNode* (int, int)>
            sortedListToBSTHelper = [&](int low, int high) -> TreeNode*
        {
           if (low > high) return nullptr;
           if (low == high)
               return new TreeNode(nums[low]);

           int mid = low + (high - low)/2;
           TreeNode* root = new TreeNode(nums[mid]);
           root->left = sortedListToBSTHelper(low, mid-1);
           root->right = sortedListToBSTHelper(mid+1, high);

           return root;
        };
         
        TreeNode* root = sortedListToBSTHelper(0, nums.size()-1);
        return root;
    }
 // !!!!! so important *&. here need to use *& to change the node which cur point
 TreeNode* sortedListToBSTHelper(ListNode* &cur, int start, int end){ // update cur: cur is the last node after construction
   if(start > end) return NULL; // !!!terminate condition
   int mid = start + (end - start) / 2;
   TreeNode* ltree = sortedListToBSTHelper(cur,start, mid - 1); // use start and end
   TreeNode* subroot = new TreeNode(cur->val); // mid  !!!
   // cur means the points will be use!!!
   subroot->left = ltree;
   cur = cur->next;
   TreeNode* rtree = sortedListToBSTHelper(cur, mid + 1, end);
   subroot->right = rtree;
   return subroot;
 }
 TreeNode* sortedListToBSTHelper(ListNode* head, int nodeNum) {
     if(head == NULL || nodeNum == 0) {
         return NULL;
     }
     ListNode* mid = head;
     int midNum = nodeNum / 2;
     while(midNum--) {
         mid = mid->next;
     }
     TreeNode *root = new TreeNode(mid->val);
     root->left = sortedListToBSTHelper(head, nodeNum/2);
     root->right = sortedListToBSTHelper(mid->next, nodeNum - nodeNum/2 - 1);
     return root;
 }
 TreeNode* sortedListToBST(ListNode* head) {
     int nodeNum = 0;
     ListNode* p = head;
     while(p) {
         p = p->next;
         nodeNum++;
     }
     return sortedListToBSTHelper(head, nodeNum);
 }
  TreeNode* sortedListToBST(ListNode* head){
    int len = 0;
    ListNode* cur = head;
    while(cur){
      len++;
      cur = cur->next;
    }

    sortedListToBSTHelper(head, 0, len - 1);
  }