算法:
- 第一步找到链表的中点将其作为根节点
- 第二步删除中点将链表一分为二
- 第三步递归上面的步骤
快慢指针得到链表的中点
ListNode* findMidNode(ListNode* head)
{
ListNode *slow, *fast;
slow = head;
fast = head;
while (fast && fast->next)
{
slow = slow->next;
fast = fast->next->next;
}
return slow;
}
整体代码:
ListNode* findMidNode(ListNode* head)
{
ListNode *slow, *fast;
slow = head;
fast = head;
while (fast && fast->next)
{
slow = slow->next;
fast = fast->next->next;
}
return slow;
}
ListNode* findMidNodePreNode(ListNode* head, ListNode* mid_node)
{
if (head == mid_node)
return head;
ListNode *midNode_preNode = NULL;
ListNode *tmp = head;
while (tmp->next != mid_node)
tmp = tmp->next;
midNode_preNode = tmp;
return midNode_preNode;
}
TreeNode* sortedListToBST(ListNode* head) {
if (!head) return NULL;
if (!head->next) return new TreeNode(head->val);
ListNode *mid_node = findMidNode(head);
ListNode *right_headNode = mid_node->next;
/*找到midNode的前一个节点位置*/
ListNode*midNode_preNode = findMidNodePreNode(head, mid_node);
midNode_preNode->next = NULL;
TreeNode* root = new TreeNode(mid_node->val);
root->left = sortedListToBST(head);
root->right = sortedListToBST(right_headNode);
return root;
}