class Solution {
public:
TreeNode* dfs(const vector<int>& s, int l, int r) {
if (l > r) return nullptr;
int mid = l + r >> 1;
return new TreeNode(s[mid], dfs(s, l, mid - 1), dfs(s, mid + 1, r));
}
TreeNode* sortedListToBST(ListNode* head) {
vector<int>s;
while (head != nullptr) {
s.emplace_back(head->val);
head = head->next;
}
return dfs(s, 0, s.size() - 1);
}
};
class Solution {
public:
TreeNode* sortedListToBST(ListNode* head) {
if (head == nullptr) return nullptr;
if (head->next == nullptr) return new TreeNode(head->val);
auto p = head;
auto q = p;
ListNode* t = nullptr;
while (q != nullptr) {
q = q->next;
if (q == nullptr) break;
t = p;
p = p->next;
q = q->next;
}
t->next = nullptr;
return new TreeNode(p->val, sortedListToBST(head), sortedListToBST(p->next));
}
};
class Solution {
public:
ListNode* dfs(TreeNode* node, ListNode* head) {
if (node == nullptr) return head;
head=dfs(node->left, head);
node->val = head->val;
head = head->next;
head = dfs(node->right, head);
return head;
}
TreeNode* sortedListToBST(ListNode* head) {
if (head == nullptr) return nullptr;
queue<TreeNode*>que;
auto ansnode = new TreeNode;
que.push(ansnode);
auto p = head->next;
while (p != nullptr) {
que.front()->left = new TreeNode;
que.push(que.front()->left);
p = p->next;
if (p != nullptr) {
que.front()->right = new TreeNode;
que.push(que.front()->right);
p = p->next;
que.pop();
}
}
dfs(ansnode, head);
return ansnode;
}
};