Convert Sorted List to Binary Search Tree
Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.
tags: depth-first-search, linked list
版本一,每次取链表的中点作为root,左右分别递归调用。
我为了方便通过index取ListNode,便把list复制成了ector,却报出内存超出限额错误。尝试改进,不加vector,用时间换空间的方法。
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ /** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: vector<ListNode*> listnode; TreeNode *sortedListToBST(ListNode *head) { while(head != NULL){ listnode.push_back(head); head = head->next; } return _sortedListToBST(listnode, 0, listnode.size()); } TreeNode * _sortedListToBST(vector<ListNode *>nodes, int start, int end){ if (start >= end){ return NULL; } else if(start + 1 == end){ TreeNode * p = new TreeNode(nodes[start]->val); p->left = p->right = NULL; return p; } else{ int mid = (end + start) / 2; TreeNode * p = new TreeNode(nodes[mid]->val); p->left = _sortedListToBST(nodes, start, mid); p->right = _sortedListToBST(nodes, mid + 1, end); return p; } } };
版本二:直接在ListNode上操作,AC。需要注意的是,我们需要在递归函数中,每次都更新head的位置。因为算法中耗时的部分在getNodeById这里,我们应该每次都缩小list的长度,以减少时间开销。
时间复杂度O(nlogn)
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ /** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: TreeNode *sortedListToBST(ListNode *head) { int n = getListLength(head); return _sortedListToBST(head, n); } TreeNode * _sortedListToBST(ListNode * head, int count){ if (count == 0){ return NULL; } else if(count == 1){ TreeNode * p = new TreeNode(head->val); p->left = p->right = NULL; return p; } else{ int mid = count / 2; ListNode * midNode = getNodeByIndex(head, mid); TreeNode * p = new TreeNode(midNode->val); p->left = _sortedListToBST(head, mid); p->right = _sortedListToBST(midNode->next, count - mid - 1); return p; } } int getListLength(ListNode * head){ int i; for(i = 0; head != NULL; i++){ head = head->next; } return i; } ListNode * getNodeByIndex(ListNode * head, int idx){ while(idx--){ head = head->next; } return head; } };