Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.
分析: 根据一个有序链表,得到一个平衡二叉搜索树,主要是根据快慢指针得到链表的中点,然后将链表分成两半
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: ListNode* findMiddle(ListNode* start){ ListNode *low = start, *fast = start; ListNode* prelow=nullptr; while(fast!=nullptr){ fast = fast->next; if(fast){ fast = fast->next; prelow = low; low = low->next; } } if(prelow) prelow->next =nullptr;//break the list return low; } TreeNode* sortedListToBST(ListNode* head) { if(head==nullptr) return nullptr; if(head->next ==nullptr) return new TreeNode(head->val); ListNode* mid = findMiddle(head); TreeNode* root = new TreeNode(mid->val); root->left = sortedListToBST(head); root->right = sortedListToBST(mid->next); return root; } };