leetcode 16
给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
示例:
给定的有序链表: [-10, -3, 0, 5, 9],
一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树:
0
/ \
-3 9
/ /
-10 5
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */ /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */ class Solution { public: TreeNode* sortedListToBST(ListNode* head) { TreeNode* root; if(!head) return nullptr; if(!head->next) { root = new TreeNode(head->val); return root; } ListNode *p,*q,*pre; pre=p=q=head; while(q!=nullptr && q->next!=nullptr) { pre=p; p=p->next; q=q->next->next; } root =new TreeNode(p->val); pre->next =nullptr;//需要把这条链断开,然后分别再找中间点 root->left = sortedListToBST(head); root->right = sortedListToBST(p->next); return root; } };
注意:1.注意快慢指针的用法 2.注意头节点问题:有头节点,偶数个时选取第一个中间数,没有头结点时选取第二个(对于该题没有影响)

浙公网安备 33010602011771号