思路:设计一个找到链表中位数位置的函数,然后以该位置为分界位置,左右递归求解,注意,找到中位数位置后,需要将左边链表与该位置断开,否则会出现死循环。
code:
class Solution {
public:
ListNode *findMidNode(ListNode *head){
ListNode * p = head, *q;
if(p->next == NULL) return p;
q = p;
while(q != NULL && q->next != NULL){
p = p->next;
q = q->next->next;
}
return p;
}
TreeNode *sortedListToBST(ListNode *head) {
if(head == NULL)return NULL;
ListNode *midNode = findMidNode(head);
TreeNode *tNode = new TreeNode(midNode->val);
ListNode *p = head;
while(p != midNode && p->next != midNode)
p = p->next;
p->next = NULL;
if(p != midNode)
tNode->left = sortedListToBST(head);
tNode->right = sortedListToBST(midNode->next);
return tNode;
}
};