当前位置: 首页 > news >正文

Leetcode148,109以及二者的合并 -> Tencent面试算法题 - 无序双向链表转BST

根源简述

        这道题是腾讯在2024/8/30考的一道面试题,整体来说,难度不大,就是代码量稍稍有点儿大,让我们一起来看一下吧


题目描述

        整数无序双向链表能否转BST(二叉搜索树),如果能,怎么转 (尽可能少的时间复杂度和空间复杂度),如果不能为什么?


解题思路

这道题想都不用想,一定是能转的,要不然考你干啥,接下来就看怎么转
我们可以把这个题拆成两个部分
1.整数无序双向链表进行排序

2.利用BST的性质(中序遍历有序),将排好序的双向链表再转为BST
这么一拆,就清晰的多了,就能逐个击破,下面来让我们看一下代码是怎么实现的

代码实现

class ListNode {int val;ListNode prev;ListNode next;ListNode(int val) {this.val = val;}
}class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int val) {this.val = val;}
}public class DoublyLinkedListToBST {// 将双向链表进行排序public ListNode sortDoublyLinkedList(ListNode head) {// 如果链表为空或只有一个节点,直接返回if (head == null || head.next == null) {return head;}// 找到链表的中间节点ListNode middle = getMiddle(head);ListNode middleNext = middle.next;// 将链表从中间断开middle.next = null;if (middleNext!= null) {middleNext.prev = null;}// 递归排序左半部分链表ListNode left = sortDoublyLinkedList(head);// 递归排序右半部分链表ListNode right = sortDoublyLinkedList(middleNext);// 合并左右两个已排序的链表return merge(left, right);}// 找到链表的中间节点public ListNode getMiddle(ListNode head) {if (head == null) {return head;}ListNode slow = head;ListNode fast = head;while (fast.next!= null && fast.next.next!= null) {fast = fast.next.next;slow = slow.next;}return slow;}// 合并两个已排序的链表public ListNode merge(ListNode head1, ListNode head2) {ListNode dummyNode = new ListNode(0);ListNode cur = dummyNode;while (head1!= null && head2!= null) {if (head1.val <= head2.val) {cur.next = head1;head1.prev = cur;head1 = head1.next;} else {cur.next = head2;head2.prev = cur;head2 = head2.next;}cur = cur.next;}if (head1!= null) {cur.next = head1;head1.prev = cur;}if (head2!= null) {cur.next = head2;head2.prev = cur;}ListNode head = dummyNode.next;head.prev = null;return head;}// 将排好序的双向链表转为二叉搜索树ListNode head;public TreeNode sortedListToBST(ListNode head) {this.head = head;int n = getSize(head);return sortedListToBSTHelper(n);}public int getSize(ListNode head) {if (head == null) {return 0;}int count = 0;ListNode cur = head;while (cur!= null) {count++;cur = cur.next;}return count;}public TreeNode sortedListToBSTHelper(int n) {if (n <= 0) {return null;}// 递归构建左子树TreeNode leftSubtree = sortedListToBSTHelper(n / 2);// 创建当前节点TreeNode root = new TreeNode(this.head.val);// 连接左子树root.left = leftSubtree;// 移动链表指针到下一个节点this.head = this.head.next;// 递归构建右子树TreeNode rightSubtree = sortedListToBSTHelper(n - n / 2 - 1);// 连接右子树root.right = rightSubtree;return root;}
}

附言

如果上述代码看不懂的话,建议先把这两道题刷一下
148. 排序链表 - 力扣(LeetCode)
109. 有序链表转换二叉搜索树 - 力扣(LeetCode)

相关文章:

Leetcode148,109以及二者的合并 -> Tencent面试算法题 - 无序双向链表转BST

根源简述 这道题是腾讯在2024/8/30考的一道面试题&#xff0c;整体来说&#xff0c;难度不大&#xff0c;就是代码量稍稍有点儿大&#xff0c;让我们一起来看一下吧 题目描述 整数无序双向链表能否转BST&#xff08;二叉搜索树&#xff09;&#xff0c;如果能&#xff0c;怎么转…...

【蓝桥杯选拔赛真题77】python计算小球 第十五届青少年组蓝桥杯python选拔赛真题 算法思维真题解析

目录 python计算小球 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python计算小球 第十五届蓝桥杯青少年组python比赛选拔赛真题 一、题目要…...

获取Hive表备注

DESCRIBE EXTENDED 表名;先获取Detailed Table Information这行的data_type字段数据&#xff0c;进行正则匹配&#xff0c;拿到表备注&#xff0c;如下&#xff1a; String str ReUtil.get("parameters:\\{(?!.*?\\().*transient_lastDdlTime.*?comment(.*?)\\}&quo…...

10.30学习

一、科学计数法 C语言中的科学计数法主要用于表示非常大或非常小的浮点数&#xff0c;它遵循以下格式&#xff1a; 1. E或e表示指数&#xff1a; 科学计数法中的E或e用来表示“指数”&#xff08;Exponent&#xff09;。例如&#xff0c; 1.23e4 或 1.23E4 表示 1.23 * 10^4…...

什么是栈溢出

一、什么是栈溢出 栈溢出&#xff08;Stack Overflow&#xff09;就是指在程序运行过程中&#xff0c;往栈里存放的数据超过了栈所能容纳的最大容量&#xff0c;从而导致程序出现异常行为的情况。这就好比一个箱子本来只能装一定数量的物品&#xff0c;硬要往里面塞更多的东西&…...

在linux中arm-linux-gcc和/usr/bin/gcc有啥区别

在Linux中&#xff0c;arm-linux-gcc和/usr/bin/gcc都是编译器&#xff0c;但它们之间存在显著的区别&#xff0c;主要体现在编译目标、使用场景以及编译生成的二进制文件的可执行性上。而软链接则是Linux文件系统中的一种特殊文件类型&#xff0c;用于创建一个文件的别名。 a…...

常用环境部署(二十二)——MySQL的数据库迁移到另一个机器上

1、导出原数据库的数据 mysqldump -u [用户名] -p[密码] [数据库名] > database_dump.sql 命令示例&#xff1a; mysqldump -u root -p123456 wd > /opt/wd.sql 2、在新机器上创建数据库 mysql -u [用户名] -p -e "CREATE DATABASE [新数据库名]" 命令示…...

两台主机只能单方向ping通

可能性比较大的原因时ping不通的那台主机安装了个人防火墙。 在共享上网的机器中&#xff0c;出于安全考虑&#xff0c;大部分主机都安装个人防火墙软件。几乎所有个人防火墙软件默认不允许其他机器ping本机。一般的做法是将来自外部的ICMP请求报文滤掉&#xff0c;对本机出去的…...

redis windows 5.0 下载

Redis 简介 Redis 是一个高性能的 key-value 数据库&#xff0c;广泛应用于缓存、消息队列、实时分析等场景。它支持多种数据结构&#xff0c;如字符串、哈希、列表、集合、有序集合等&#xff0c;并且提供了丰富的操作命令&#xff0c;能够满足各种复杂的数据处理需求。 下载…...

视频转gif怎么转换?6种视频格式转换简单方法分享,附操作截图!

gif动图凭借其简洁而生动的特点&#xff0c;已成为互联网交流中不可或缺的一部分。尽管gif和视频在技术上有所不同&#xff0c;但两者都能以短小的帧展现动作&#xff0c;而gif通常不带声音&#xff0c;具备循环播放的特性。因此&#xff0c;出于创建gif动图、存储更多媒体文件…...

StructRAG简介

StructRAG是一种新型的框架&#xff0c;旨在提升大型语言模型&#xff08;LLMs&#xff09;在知识密集型推理任务中的性能。它通过推理时的混合信息结构化机制&#xff0c;根据任务需求以最合适的格式构建和利用结构化知识。 以下是StructRAG的核心组成部分和工作流程&#xff…...

java脚手架系列12-mongoDB

之所以想写这一系列&#xff0c;是因为之前工作过程中有几次项目是从零开始搭建的&#xff0c;而且项目涉及的内容还不少。在这过程中&#xff0c;遇到了很多棘手的非业务问题&#xff0c;在不断实践过程中慢慢积累出一些基本的实践经验&#xff0c;认为这些与业务无关的基本的…...

python四舍五入保留两位小数

在 Python 中&#xff0c;你可以使用内置的 round() 函数来对数字进行四舍五入并保留两位小数。round() 函数有两个参数&#xff1a;要四舍五入的数字和要保留的小数位数。以下是一个简单的示例&#xff1a; # 示例数字 number 3.14159# 四舍五入保留两位小数 rounded_number…...

期权懂|有什么期权交易策略能够稳赚不赔的?

期权小懂小编每日分享期权知识&#xff0c;帮助期权新手及时有效地掌握即市趋势与新资讯&#xff01; 有什么期权交易策略能够稳赚不赔的? 期权交易具有风险性&#xff0c;没有任何一种策略能够保证稳赚不赔。 以下是一些常见的期权交易策略&#xff0c;虽不能保证盈利&#…...

笔记本脱机状态

先是显示脱机&#xff0c;请尝试其他方法登录 1.按照联想客服&#xff0c;进入高级选项里面&#xff0c;清除两个更新项目&#xff0c;没有卸载成功 2.安装wepe&#xff0c;先是能检测到U盘&#xff0c;但是进不去&#xff0c;然后我淘宝淘帮我做盘&#xff0c;我自己重新装了一…...

Node.js:模块 包

Node.js&#xff1a;模块 & 包 模块module对象 包npm安装包配置文件镜像源 分类 模块 模块化是指解决一个复杂问题时&#xff0c;自顶向下逐层把系统划分成若干模块的过程。对于整个系统来说&#xff0c;模块是可组合、分解和更换的单元。 简单来说&#xff0c;就是把一个…...

油动无人机动力测试台-60公斤级-Flight Stand 60 ICE

产品简介 通过Flight Stand 60 ICE测试台对内燃机和螺旋桨的拉力&#xff0c;扭矩&#xff0c;转速&#xff0c;燃油流量&#xff0c;温度&#xff0c;功率和螺旋桨效率的测量&#xff0c;帮助用户精准地描述和评估其性能参数&#xff0c;以不断地优化和提升燃油动力系统性能。…...

给grasshopper中的python脚本电池加个标签

ghenv.Component.Message test使用python脚本创建的电池&#xff0c;也可以保存起来。 File – Create User Object...

别被忽悠了 Lua 数组真的也可以从 0 开始索引?

先前我说 Lua 数组从 1 开始不太爽&#xff0c;很多人来纠正我说也可以从 0 开始&#xff0c;比如&#xff1a; local m { [0] 100, 101, 102, 103 }然后访问时 m[0] 也可以正常访问到第 0 个元素&#xff0c;所以 “Lua 给你充分自由度&#xff0c;让你可以从任意下标索引数…...

docker占用磁盘过多问题

我在windows系统上用docker&#xff0c;安装在C盘环境下&#xff0c;我发现C盘占用了大量的空间&#xff0c;查找后发现是docker的映像文件占用的&#xff0c;于是开始清理&#xff0c;中间还踩个坑&#xff0c;记录一下&#xff0c;下次需要的时候方便找。 踩坑 我本想移动映…...

ComfyUI-WanVideoWrapper:AI视频生成性能优化的终极指南

ComfyUI-WanVideoWrapper&#xff1a;AI视频生成性能优化的终极指南 【免费下载链接】ComfyUI-WanVideoWrapper 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI-WanVideoWrapper 在AI视频生成领域&#xff0c;显存限制和部署复杂性一直是开发者面临的核心挑…...

基于51单片机与74LS30的智能抢答器系统设计与实现

1. 智能抢答器系统概述 在各类知识竞赛、课堂互动和电视节目中&#xff0c;抢答器都是不可或缺的设备。传统机械式抢答器存在响应慢、易误触等问题&#xff0c;而基于51单片机的智能抢答器系统则完美解决了这些痛点。这个系统我做过不下十次&#xff0c;实测响应时间可以控制在…...

告别重启:深入解析NVML驱动/库版本不匹配的根源与动态修复

1. 当NVML罢工时&#xff1a;理解"Driver/library version mismatch"的本质 那天深夜&#xff0c;我正在调试一个CUDA计算任务&#xff0c;突然发现nvidia-smi命令返回了令人心碎的报错&#xff1a;"Failed to initialize NVML: Driver/library version mismatc…...

2025年项目管理工具深度评测:Gitee如何引领技术团队协作新范式

随着数字化转型进入深水区&#xff0c;项目管理工具正从简单的任务管理平台进化为企业数字化转型的核心枢纽。在2025年最新发布的《全球项目管理工具评测报告》中&#xff0c;Gitee凭借其独特的"开发协作"一体化设计&#xff0c;成为中国技术团队的首选平台。本文将深…...

技术驱魔实录:给服务器泼黑狗血除邪

在软件测试的世界里&#xff0c;我们常常面对无形的“邪灵”——那些潜伏在代码深处的Bug、性能瓶颈或安全漏洞。它们如同传说中的恶鬼&#xff0c;悄无声息地侵蚀系统稳定性&#xff0c;让服务器在关键时刻崩溃。传统驱邪术中&#xff0c;黑狗血被视为至阳之物&#xff0c;能破…...

3个高效技巧:深度解析ComfyUI节点管理的实战指南

3个高效技巧&#xff1a;深度解析ComfyUI节点管理的实战指南 【免费下载链接】ComfyUI-Easy-Use In order to make it easier to use the ComfyUI, I have made some optimizations and integrations to some commonly used nodes. 项目地址: https://gitcode.com/gh_mirrors…...

Python AI用例生成效率实战手册(企业级自动化工作流全拆解)

第一章&#xff1a;Python AI用例生成效率的核心价值与企业级定位在AI工程化落地加速的当下&#xff0c;Python凭借其丰富的生态&#xff08;如LangChain、LlamaIndex、transformers、scikit-learn&#xff09;和低门槛的可编程性&#xff0c;已成为企业构建AI用例生成流水线的…...

如何用VarifocalNet提升目标检测性能?从FCOS到VFNet的实战解析

从FCOS到VFNet&#xff1a;实战解析VarifocalNet如何突破目标检测性能瓶颈 目标检测领域近年来涌现出大量创新算法&#xff0c;但性能提升逐渐进入平台期。传统方法如FCOS虽然简洁高效&#xff0c;但在处理密集物体和复杂场景时仍存在明显局限。本文将深入剖析VarifocalNet(VFN…...

告别.crx文件!手把手教你用crx2rnx工具转换GNSS观测值为RINEX格式(附武汉大学IGS数据下载指南)

从CRX到RINEX&#xff1a;GNSS观测数据转换实战指南 在卫星导航定位领域&#xff0c;RINEX&#xff08;Receiver Independent Exchange Format&#xff09;作为国际通用的标准数据格式&#xff0c;几乎成为所有GNSS数据处理软件的"通用语言"。然而&#xff0c;许多初…...

Halcon 标定(Calibration)与引导(Guidance)的工业实践:从理论到高精度落地的全链路解析

1. Halcon标定技术的基础认知 第一次接触Halcon标定时&#xff0c;我和很多新手一样被那些专业术语吓到了。但真正用起来才发现&#xff0c;这套系统就像给机器装上了"眼睛和尺子"。简单来说&#xff0c;标定就是教会相机看懂真实世界的尺寸和位置。想象一下&#xf…...