题目描述
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 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) {
if(head==nullptr) return nullptr;
if(head->next==nullptr) return new TreeNode(head->val);
ListNode *pre,*slow,*quick;
slow=head;
quick=head;
pre=nullptr;
while(quick!=nullptr&&quick->next!=nullptr)
{
pre=slow;
slow=slow->next;
quick=quick->next->next;
}
TreeNode *root=new TreeNode(slow->val);
root->right=sortedListToBST(slow->next);
pre->next=nullptr;
root->left=sortedListToBST(head);
delete slow;
return root;
}
};
Addition Solution
public TreeNode sortedListToBST(ListNode head) {
return toBST(head, null);
}
private TreeNode toBST(ListNode head, ListNode tail) {
if (head == tail)
return null;
// 申请两个指针,fast移动速度是low的两倍
ListNode fast = head;
ListNode slow = head;
while (fast != tail && fast.next != tail) {
fast = fast.next.next;
slow = slow.next;
}
TreeNode root = new TreeNode(slow.val);
root.left = toBST(head, slow);
root.right = toBST(slow.next, tail);
return root;
}