Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.

主要想好返回值,每层的返回的东西

思路一: 就是要每次遍历两遍来找中间值。

思路二: 用双指针,第一个指针每次走两步,第二个指针每次走一步,然后当第一个指针走到末尾的时候,第二个就是中间值。

思路三: 一次遍历,先构建左子数,然后构建list上的node往右走。

 1 class Solution {
 2 public:
 3     TreeNode *sortedListToBST(ListNode *head) {
 4         if(head==NULL)
 5             return NULL;
 6         ListNode *p = head; 
 7         TreeNode *root = new TreeNode(head->val);
 8 
 9         if(head->next == NULL)
10             return root; 
11         int length = 0;
12         while(p)
13         {
14             length ++;
15             p = p->next; 
16         }
17 
18         ListNode *fakeHead = new ListNode(0);
19         fakeHead->next = head; 
20         ListNode * p1 = head; 
21         ListNode * pre = fakeHead;
22         int mid = 1;
23         while(mid != (length+1)/2)
24         {
25             mid++;
26             pre = pre->next; 
27             p1 = p1->next; 
28         }
29         pre->next = NULL;
30         root->val = p1->val; 
31         ListNode *first = head; 
32         ListNode *second = p1->next; 
33         p1->next = NULL;
34         
35         root->right = sortedListToBST(second);
36         p1->next = NULL;
37         if(length>=3)
38             root->left = sortedListToBST(first);
39         return root;   
40     }
41 };

思路三:

class Solution {
public:
    TreeNode *sortedListToBST(ListNode *head) {
        int listLen = 0;
        ListNode *cur = head;
        while(cur) {
            listLen++;
            cur = cur->next;
        }
        return sortedListToBST(head, 0, listLen-1);
    }
    
    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);
        head = head->next;
        TreeNode *rightChild = sortedListToBST(head, mid+1, end);
        root->left = leftChild;
        root->right = rightChild;
        return root;
    }
};

 

posted on 2015-04-24 13:04  又岸  阅读(109)  评论(0)    收藏  举报