Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST. 方法1: 递归的每层中都把当前head开始的list从中间切开,然后取中点作为当前的root,然后从head递归得到root->left, 从中点的next开始递归得到root->right 方法2: 先遍历一次得到长度len,然后递归buildTree,通过l,r这两个起始点的index来控制递归的base返回,同时每层递归中都递增head( 注意传的是指针的引用 );这样一来递归的语义就很清晰了: a. 如果l > r,说明没有有效节点了,返回NULL b, 算的中点m, 然后处理l到m - 1得到以m为根的左树(root->left); c. 创建当前root(m), 然后递增head节点(因为当前函数用掉了m来当作root); d. 递归得到m + 1到r的右子树(root->right) /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ /** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: TreeNode *sortedListToBST(ListNode *head) { // IMPORTANT: Please reset any member data you declared, as // the same Solution instance will be reused for each test case. // 1 /* if (head == NULL) return NULL; if (head->next == NULL) return new TreeNode(head->val); ListNode *hi = head->next->next, *mo = head; while (hi != NULL && hi->next != NULL) { hi = hi->next->next; if (hi == NULL) break; mo = mo->next; } hi = mo->next; TreeNode *root = new TreeNode(hi->val); mo->next = NULL; root->left = sortedListToBST(head); root->right = sortedListToBST(hi->next); return root; */ // 2 int len = 0; ListNode *cur = head; while (cur != NULL) { ++len; cur = cur->next; } return buildTree(head, 0, len - 1); } TreeNode *buildTree(ListNode *&head, int l, int r) { if (l > r) return NULL; int m = l + ((r - l) >> 1); TreeNode *left = buildTree(head, l, m - 1); TreeNode *root = new TreeNode(head->val); head = head->next; root->left = left; root->right = buildTree(head, m + 1, r); return root; } };