
[LeetCode题解]109. 有序链表转换二叉搜索树 | 快慢指针 + 递归
发布日期:2021-05-09 04:32:22
浏览次数:21
分类:博客文章
本文共 1620 字,大约阅读时间需要 5 分钟。
题目描述
给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
示例:
给定的有序链表: [-10, -3, 0, 5, 9],一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树: 0 / \ -3 9 / / -10 5
解题思路
题目说给定的单链表是有序的,要转换为高度平衡的二叉搜索树,也就是说这个链表是树的前序遍历。
因此思路就转为:找到链表的中间节点,然后以此节点把链表一分为二,作为左右子树的范围。
使用快慢指针+递归
- 通过快慢指针为到链表的中间节点。
- 通过递归来构成节点的左右子树。
- 递归结束条件是链表为空时链表只有一个元素时返回其本身,即
head
;
代码
/** * Definition for singly-linked list. * public class ListNode { * public int val; * public ListNode next; * public ListNode(int val=0, ListNode next=null) { * this.val = val; * this.next = next; * } * } *//** * Definition for a binary tree node. * public class TreeNode { * public int val; * public TreeNode left; * public TreeNode right; * public TreeNode(int val=0, TreeNode left=null, TreeNode right=null) { * this.val = val; * this.left = left; * this.right = right; * } * } */public class Solution { public TreeNode SortedListToBST(ListNode head) { // 快慢指针:先找到中间节点,然后左右两边的链表作为左右子树,直到链表只有一个节点。 if(head == null || head.next == null) { return head; } ListNode fast = head, slow = head, pre = null; while(fast != null && fast.next != null) { fast = fast.next.next; pre = slow; slow = slow.next; } TreeNode root = new TreeNode(slow.val); pre.next = null; // 把链表一分为二 root.left = SortedListToBST(head); root.right = SortedListToBST(slow.next); return root; }}
复杂度分析
- 时间复杂度:\(O(nlogn)\),其中 \(n\) 是链表长度。
- 空间复杂度:\(O(1)\)。
发表评论
最新留言
逛到本站,mark一下
[***.202.152.39]2025年04月03日 01时34分08秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
dojo/request模块整体架构解析
2019-03-06
互联网App应用程序测试流程及测试总结
2019-03-06
如何使用google搜索?
2019-03-06
IntelliJ IDEA 中,项目文件右键菜单没有svn选项解决办法
2019-03-06
IDEA 调试Java代码的两个技巧
2019-03-06
深入理解JavaScript函数
2019-03-06
【spring源码系列】之【xml解析】
2019-03-06
(在模仿中精进数据可视化07)星球研究所大坝分布可视化
2019-03-06
(数据科学学习手札27)sklearn数据集分割方法汇总
2019-03-06
(数据科学学习手札40)tensorflow实现LSTM时间序列预测
2019-03-06
从零开始学安全(十六)● Linux vim命令
2019-03-06
阿里巴巴Json工具-Fastjson教程
2019-03-06
Spring Cloud Gateway - 快速开始
2019-03-06
Java对象转JSON时如何动态的增删改查属性
2019-03-06
Python 面向对象进阶
2019-03-06
Linux常用统计命令之wc
2019-03-06
shell脚本里使用echo输出颜色
2019-03-06
并发编程——IO模型详解
2019-03-06
Java之封装,继承,多态
2019-03-06