Given the head
of a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.
For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never differ by more than 1.
Example 1:
Input: head = [-10,-3,0,5,9] Output: [0,-3,9,-10,null,5] Explanation: One possible answer is [0,-3,9,-10,null,5], which represents the shown height balanced BST.
Example 2:
Input: head = [] Output: []
Constraints:
head
is in the range [0, 2 * 104]
.-105 <= Node.val <= 105
- /**
- * 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) {
- if (!head) {return nullptr;}
- if (!head->next) {return new TreeNode(head->val);}
- auto slow = head;
- auto fast = head;
- auto pre = head;
- while(fast && fast->next) {
- pre = slow;
- slow = slow->next;
- fast = fast->next->next;
- }
- pre->next = nullptr;
- TreeNode* root = new TreeNode(slow->val);
- root->left = sortedListToBST(head);
- root->right = sortedListToBST(slow->next);
- return root;
- }
- };
- /**
- * Definition for singly-linked list.
- * public class ListNode {
- * int val;
- * ListNode next;
- * ListNode() {}
- * ListNode(int val) { this.val = val; }
- * ListNode(int val, ListNode next) { this.val = val; this.next = next; }
- * }
- */
- /**
- * Definition for a binary tree node.
- * public class TreeNode {
- * int val;
- * TreeNode left;
- * TreeNode right;
- * TreeNode() {}
- * TreeNode(int val) { this.val = val; }
- * TreeNode(int val, TreeNode left, TreeNode right) {
- * this.val = val;
- * this.left = left;
- * this.right = right;
- * }
- * }
- */
- class Solution {
- public TreeNode sortedListToBST(ListNode head) {
- if (head == null) {return null;}
- if (head.next == null) {return new TreeNode(head.val);}
- ListNode slow = head, fast = head, pre = head;
- while (fast != null && fast.next != null) {
- pre = slow;
- slow = slow.next;
- fast = fast.next.next;
- }
- pre.next = null;
- TreeNode root = new TreeNode(slow.val);
- root.left = sortedListToBST(head);
- root.right = sortedListToBST(slow.next);
- return root;
- }
- }