109. Convert Sorted List to Binary Search Tree

来源:互联网 发布:兄弟连php强化就业 编辑:程序博客网 时间:2024/04/28 09:46

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

这题和数组的区别在于节点值存储在链表里,因此没有办法像数组那样按下标取值。

可以每次用两个指针,一个指针一次移动两步,一个一次移动一步,这样的话等移动快的那个指针完成移动后,慢的那个指针一定指向中间值。

/** * Definition for singly-linked list. * struct ListNode { *     int val; *     ListNode *next; *     ListNode(int x) : val(x), next(NULL) {} * }; *//** * Definition for a binary tree node. * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:    TreeNode* sortedListToBST(ListNode* head) {                if(!head) return NULL;        if(!head->next) return new TreeNode(head->val);                ListNode* fast=head->next->next;//一开始在想为什么这里要赋成head->next->next呢,这样配合后面的slow->next不是很繁琐吗?后来自己动手改了一下//发现这样果然不行,主要问题出在slow->next那一句,如果不用slow->next而是用slow的话,实际上并没有把链表断开,而只是把slow指向了一个空值而已。        ListNode* slow=head;                while(fast&&fast->next){            fast=fast->next->next;            slow=slow->next;        }                TreeNode* node=new TreeNode(slow->next->val);        node->right=sortedListToBST(slow->next->next);        slow->next=NULL;        node->left=sortedListToBST(head);                return node;            }};


0 0
原创粉丝点击