当前位置: 首页 > 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;下次需要的时候方便找。 踩坑 我本想移动映…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下&#xff0c;卢森堡罗伯特舒曼医院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;凭借在无菌制剂生产流程中引入增强现实技术&#xff08;AR&#xff09;创新项目&#xff0c;荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】&#xff0c;注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录&#xff08;即exe所在文件夹&#xff09;加入系统变量…...