Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.
方法一:
双指针策略,快指针一次走2个节点,慢指针一次走1个节点,当快指针到尾部时,慢指针对应的即为中间节点。但这种方法的时间复杂度为O(N logN):每层递归一共访问N/2个节点,一共log N层递归(对应树的高度)。 第一种方法可以进行重写
class Solution {
public:
TreeNode *sortedListToBST(ListNode *head) {
return build(head, NULL);
}
TreeNode* build(ListNode* start, ListNode* end) {
if(start == end) {
return NULL;
}
ListNode* fast = start;
ListNode* slow = start;
while(fast != end && fast->next != end) {
slow = slow->next;
fast = fast->next->next;
}
TreeNode* node = new TreeNode(slow->val);
node->left = build(start, slow);
node->right = build(slow->next, end);
return node;
}
};
第二种方法 不需要反复遍历中间节点,我们只需要按照链表的顺序去创建即可以,有点中序遍历的意思
class Solution {
public:
TreeNode* sortedListToBST(ListNode* head) {
int listLen = 0;
ListNode* cur = head;
while(cur)
{
listLen++;
cur = cur->next;
}
return sortedListToBST(head, 1, listLen);
}
TreeNode* sortedListToBST(ListNode *&head, int start, int end)
{
if(start > end) return NULL;
int mid = start+(end-start)/2;
TreeNode* leftChild = sortedListToBST(head, start, mid-1);
TreeNode* root = new TreeNode(head->val);
root->left = leftChild;
head = head->next;
TreeNode* rightChild = sortedListToBST(head, mid+1, end);
root->right = rightChild;
return root;
}
};