java数据结构与算法刷题-----LeetCode109. 有序链表转换二叉搜索树

【中等】力扣算法题解析LeetCode109:有序链表转换二叉搜索树 题目要求将升序链表转换为平衡二叉搜索树(BST)。通过快慢指针法找到链表中点作为根节点,分割左右子链表后递归构建左右子树,确保BST性质和平衡性。时间复杂度O(n log n),空间复杂度O(log n)。Java实现利用快慢指针分割链表,递归构造BST,并通过边界条件处理空链表或单节点情况。代码简洁高效,已通过力扣测试。 (字数:150) 阅读详情
java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.youkuaiyun.com/grd_java/article/details/123063846

在这里插入图片描述

1. 分治算法+快慢指针

解题思路:时间复杂度O( n ∗ l o g 2 n n*log_2{n} n∗log2​n),空间复杂度O( l o g 2 n log_2{n} log2​n)
  1. 这种算法和108题的逻辑是一样的,都是每次找到一个中间结点作为根,来构造二叉树,可以先参考108题
  2. 但是108题的时间复杂度是O(n).这道题的时间复杂度是O( n ∗ l o g 2 n n*log_2{n} n∗log2​n)
  3. 因为108题是数组,而不是有序链表,数组是可以直接通过下标找到中间结点的
  4. 而这道题是链表,只能通过指针遍历找到中间结点。因为题目给的链表没有下标这一说。
  5. 而找到中间结点,经典做法就是快慢指针,快指针每次走两格,慢指针每次一格,当快指针到终点时,慢指针正好位于中间结点。
🏆LeetCode108:将有序数组转换为二叉搜索树https://blog.youkuaiyun.com/grd_java/article/details/125530336
代码

在这里插入图片描述

class Solution {
    public TreeNode sortedListToBST(ListNode head) {
        return buildTree(head, null);
    }
    //分治算法,每次将链表分为两半
    public TreeNode buildTree(ListNode left, ListNode right) {
        if (left == right) return null;//如果指向同一个结点,则不需要继续分治

        ListNode mid = getMedian(left, right);//从中间分为两半,获取当前区间中的中间结点

        TreeNode root = new TreeNode(mid.val);//以这个mid结点创建root结点
        root.left = buildTree(left, mid);//分治它的左子树的根结点
        root.right = buildTree(mid.next, right);//分治它的右子树根结点
        return root;
    }
    //快慢指针,获取链表中的中间结点
    public ListNode getMedian(ListNode left, ListNode right) {
        ListNode fast = left,slow = left;//fast每次走两格,slow走一格,fast到达right时,slow到中间
        while (fast != right && fast.next != right) {
            fast = fast.next.next;
            slow = slow.next;
        }
        return slow;//返回slow即可
    }
}

2. 分治+中序遍历优化

解题思路:时间复杂度O(n),空间复杂度O( l o g 2 n log_2{n} log2​n)
  1. 二叉搜索树的中序遍历结果就是一个升序序列,也就是说,题目给出的链表什么样子,二叉搜索树中序遍历结果就是什么样子
  2. 所以我们通过中序遍历构建二叉树结点,然后将链表中的值,依次填充到二叉树中,就完成了二叉树的创建
  3. 如何分治,构建空二叉树呢?
  1. 我们先获取链表长度,这样就可以二分了
  2. 然后根据二分规则构建一个二叉树框架
  3. 然后通过中序遍历的顺序,依次填充链表中的值到二叉树中。
代码

在这里插入图片描述

class Solution {
    ListNode globalHead;//遍历链表的指针

    public TreeNode sortedListToBST(ListNode head) {
        globalHead = head;//初始指向头结点
        int length = getLength(head);//获取链表长度
        return buildTree(0, length - 1);//进入分治
    }
	//就是获取链表长度的一个方法
    public int getLength(ListNode head) {
        int ret = 0;
        while (head != null) {
            ++ret;
            head = head.next;
        }
        return ret;//返回链表长度
    }
    //构建二叉树
    public TreeNode buildTree(int left, int right) {
        if (left > right) return null;
        
        int mid = (left + right + 1) / 2; //获取中间下标
        TreeNode root = new TreeNode();//创建一个根结点
        //通过中序遍历构建,先构建这个结点的左子树
        root.left = buildTree(left, mid - 1);//它的左子树范围是left 到 mid-1
        //然后访问中
        root.val = globalHead.val;//因为BST中序遍历对应升序序列,所以正好和链表遍历顺序一致
        globalHead = globalHead.next;//同时链表指针后移
        root.right = buildTree(mid + 1, right);//然后访问右
        return root;
    }
}
腾讯滑块验证码collect参数逆向与JSVMP对抗实战 本文深入解析腾讯滑块验证码collect参数的逆向过程与JSVMP虚拟机对抗技术。通过详细的环境搭建、抓包分析和JSVMP逆向技巧,揭示collect参数的生成逻辑与加密流程,并提供完整的模拟实现方案和常见问题排查方法,助力开发者突破腾讯天御验证码的防护机制。 阅读详情

相关推荐

车载以太网入坑指南,从小白到懂哥的进阶之路【技术分享】

各位技术大佬们好!最近公司项目涉及到车载以太网,刚开始完全懵逼,花了大半个月时间各种查资料、测试设备,总算是摸清了门道。想着互联网上卧虎藏龙,肯定有不少大佬对这个技术感兴趣,所以写个帖子分享一下,顺便求各位大佬指点。

starelink的博客 1262

LeetCode 109. 有序链表转换二叉搜索树 Java实现 递归详解

这道题目考察了对链表和二叉搜索树的理解以及递归方法的应用。通过找到链表的中点并递归构建左右子树,可以有效地将有序链表转换为高度平衡的二叉搜索树。在实际应用中,类似的转换操作可能会用于数据结构的转换、算法优化等领域。掌握这种操作对于解决更复杂的问题具有重要的基础意义。希望这份文档能够帮助你更好地理解和实现有序链表转换二叉搜索树的问题!如果有任何进一步的问题或需要更多的优化,请随时告知。

Lentr0py的博客 1089

Windows+VSCode+Cline+MCP全流程配置指南

本文提供了一份详细的Windows+VSCode+Cline+MCP全流程配置指南,旨在帮助开发者打造高效的AI辅助编码工作站。文章从环境准备讲起,逐步指导安装VSCode、配置Cline插件、搭建Node.js环境,并重点详解如何通过MCP为Cline集成文件系统和GitHub等工具服务器,实现用自然语言操控开发环境,从而显著提升日常编码与文件管理效率。

weixin_28840143的博客 554

LeetCode刷题汇总

剑指offer 剑指 Offer 03 数组中重复的数字 剑指 Offer 04 二维数组中的查找 剑指 Offer 05 替换空格 剑指 Offer 06 从尾到头打印链表 剑指 Offer 07 重建二叉树 剑指 Offer 09 用两个栈实现队列 剑指 Offer 10- I 斐波那契数列 剑指 Offer 10- II 青蛙跳台阶问题 剑指 Offer 11 旋转数组的最小数字 剑指 Offer 12 矩阵中的路径 剑指 Offer 13 机器人的运动范围 剑指 Offer 14- I 剪绳子 剑指

weixin_44171872的博客 2万+

手把手教你用Wireshark抓包分析Profinet非周期通信(附实战案例)

本文详细解析了PROFINET非周期通信(RTA)的技术原理与实战应用,通过Wireshark抓包分析,揭示从PLC请求到驱动器响应的完整对话过程。涵盖实验环境搭建、关键配置步骤、典型参数访问流程及故障诊断案例,帮助工程师深入理解并优化工业网络通信性能。

Black的专栏 1050

离线语音识别模块LD3320实战:如何低成本给STM32设备加上‘耳朵’和‘嘴巴’?

本文详细介绍了如何为STM32设备集成LD3320离线语音识别模块,实现低成本语音交互方案。从硬件连接到STM32底层驱动实现,再到指令训练与词条优化技巧,完整解析了唤醒词检测与自定义指令识别的全过程。LD3320作为非特定人声识别芯片,无需网络连接,适用于智能家居、工业控制等场景,是嵌入式开发者的理想选择。

weixin_30906185的博客 556

LeetCode Java面试刷题笔记汇总

LeetCode Java刷题笔记汇总,按照类型刷题效率更高。

终生学习践行者 2948

基于CANoe的Basic Diagnostics ECU (UDS)

基于CANoe的Basic Diagnostics ECU (UDS)

farmer00的博客 9155

Java实现 LeetCode 109 有序链表转换二叉搜索树

109. 有序链表转换二叉搜索树 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。 示例: 给定的有序链表: [-10, -3, 0, 5, 9], 一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树: 0 ...

南 墙 1万+

【Unity实战篇】| 游戏轮播图效果,多种实现思路及完整教程

在众多游戏的主界面、商城、图鉴或关卡选择界面中,我们常常能看到轮播图的身影。 它以动态、直观的方式展示游戏角色、皮肤、成就或场景,不仅极大地提升了界面的美观度和交互性,还能高效地引导玩家聚焦于核心内容。 本篇文章将从零开始,一步步在Unity中构建一个功能完备、性能优良的游戏轮播图。 使用UGUI系统,通过代码驱动,实现包括自动轮播、手动拖拽、分页指示器、无限循环等核心功能。 无论是UI新手还是希望优化现有方案的开发者,这篇文章都将为你提供清晰的思路和完整的解决方案。

努力前行,总会成为自己心中的那道光 4万+

4、高光图像滤镜显著改善文本图像的光学字符识别

本文介绍了高光图像滤镜在光学字符识别(OCR)中的应用,详细探讨了其技术原理、实现步骤和在多种场景下的效果。通过增强文本图像的边缘和对比度,高光滤镜显著提升了OCR的识别率,尤其适用于扫描文档、手写笔记和低质量图像。实验结果表明,该方法在不同类型的文本图像中均表现出色,并提出了未来优化方向,如深度学习集成和多模态融合,为OCR技术的发展提供了新的可能性。

ooo22的博客 97

LeetCode 109 有序链表转换二叉搜索树 Java

LeetCode 109 有序链表转换二叉搜索树 Java题目描述代码 题目描述 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。 示例: 给定的有序链表: [-10, -3, 0, 5, 9], 一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这...

qq_29061435的博客 358

78.在 Vue3 中使用 OpenLayers 实现地图地点搜索定位功能

本文详细介绍了如何在 Vue3 中集成 OpenLayers,实现地图地点搜索和定位功能。Vue3 项目环境的搭建与依赖安装。使用语法实现地图初始化和控件集成。通过 OpenLayers 的 Popup 和 Geocoder 插件,实现地址搜索和定位。希望这篇博文能帮助你快速掌握 Vue3 与 OpenLayers 的集成技术。如果在使用过程中遇到问题,欢迎在评论区留言讨论,或者参考 OpenLayers 官方文档获得更多帮助。注意。

小彭的博客 1854

LeetCode刷题——有序链表转换二叉搜索树#109#Medium

有序链表转换二叉搜索树的思路探讨与源码     有序链表转换二叉搜索树的题目如下图,该题属于二叉树和分治类型的题目,主要考察对于分治方法的使用和二叉树本身特性的理解。本文的题目作者想到2种方法,分别是快慢指针方法和分治递归方法,其中快慢指针方法使用Java进行编写,而分治递归方法使用Python进行编写,当然这可能不是最优的解法,还希望各位大佬给出更快的算法。     本人认为该题目可以使用快慢指针方法解决,首先判断树是否为空

喷火龙与水箭龟的博客 1575

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【力扣算法】109-有序链表转换二叉搜索树

题目 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。 示例: 给定的有序链表: [-10, -3, 0, 5, 9], 一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树: 0 / \ -3 ...

ZeromaXHe的博客 479

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

LeetCode109 将有序链表转换为二叉搜索树

将有序链表转换为二叉搜索树>>> 采用二分查找法:和数组的类似,将链表分为两部分,左边的为左子树,右边的为右子树 `package JDFS; import java.util.ArrayList; import java.util.List; /** * @Author Zhou jian * @Date 2020 ${month} 2020/4/30 00...

ZHOUJIAN_TANK的博客 219

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

leetcode109_有序链表转换二叉搜索树

一. 思路应该和leetcode108_将有序数组转换为二叉搜索树差不多, 但是需要找中点, 没数组高效, 看题解如何处理. 作者:LeetCode 链接:https://leetcode-cn.com/problems/convert-sorted-list-to-binary-search-tree/solution/you-xu-lian-biao-zhuan-huan-er-cha-so...

qieyuan4083的博客 226

LeetCode题练习与总结:有序链表转换二叉搜索树--109

本文详细介绍了将升序链表转换为平衡二叉搜索树的解题思路和具体实现。利用快慢指针找到链表中间节点,以中间节点为根递归构建左右子树。文章还分析了算法的时间复杂度和空间复杂度,并总结了涉及的链表操作、递归、二叉搜索树性质等知识点。

一直学习永不止步 836

[LeetCode]109. 有序链表转换二叉搜索树(java实现)快慢指针找中点

[LeetCode]109. (java实现)1. 题目2. 读题(需要重点注意的东西)3. 解法4. 可能有帮助的前置习题5. 所用到的数据结构与算法思想6. 总结 1. 题目 2. 读题(需要重点注意的东西) 思路(): 3. 解法 ---------------------------------------------------解法---------------------------------------------------: 可能存在的问题: 4. 可能有帮助的前置习题 5. 所用

cloud的博客 338

[Leetcode][第109题][JAVA][有序链表转换二叉搜索树][分治][快慢指针][中序遍历]

【问题描述】[中等] 【解答思路】 1. 分治 快慢指针 复杂度 class Solution { public TreeNode sortedListToBST(ListNode head) { return buildTree(head, null); } public TreeNode buildTree(ListNode left, ListNode right) { if (left == right) { r

dadongwudi的博客 173
上一篇: java数据结构YZP专栏-----二叉树 && 平衡二叉树(AVL)
下一篇: java数据结构与算法刷题-----LeetCode653. 两数之和 IV - 输入二叉搜索树
ydenergy_殷志鹏
博客等级 码龄7年 5886粉丝 543原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ydenergy_殷志鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值