【Convert Sorted List to Binary Search Tree】cpp
题目:
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; // p2 point to the pre node of mid ListNode dummy(-1); dummy.next = head; ListNode *p1 = &dummy, *p2 = &dummy; while ( p1 && p1->next && p1->next->next ) { p1 = p1->next->next; p2 = p2->next;} // get the mid val & cut off the mid from linked list int val = p2->next->val; ListNode *h2 = p2->next ? p2->next->next : NULL; p2->next = NULL; // recursive process TreeNode *root = new TreeNode(val); root->left = Solution::sortedListToBST(dummy.next); root->right = Solution::sortedListToBST(h2); return root; } };
tips:
1. 沿用跟数组一样的思路,采用二分查找
2. 利用快慢指针和虚表头技巧;最终的目的是p2指向mid的前驱节点。
3. 生成该节点,并递归生成left和right (这里需要注意传递的是dummy.next而不是head,原因是如果链表中只有一个节点,传head就错误了)
============================================
第二次过这道题,熟练了一些。重点在于求ListNode的中间节点。
/** * 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* p1 = head; ListNode* pre = p1; ListNode* p2 = head; while ( p2 && p2->next ) { pre = p1; p1 = p1->next; p2 = p2->next->next; } TreeNode* root = new TreeNode(p1->val); pre->next = NULL; root->left = Solution::sortedListToBST(head); root->right = Solution::sortedListToBST(p1->next); return root; } };
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?