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; } };
浙公网安备 33010602011771号