news 2026/9/26 11:15:47

DeepSeek LeetCode 109. 有序链表转换二叉搜索树 Scala实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DeepSeek LeetCode 109. 有序链表转换二叉搜索树 Scala实现

LeetCode 109. 有序链表转换二叉搜索树 — Scala 实现

思路:转数组 + 递归构建

链表有序,BST 中序遍历也有序。最直接的做法:

  1. 把链表值收集到 Array[Int]。
  2. 递归取中点作为根,左右子区间分别构建左右子树,自然得到平衡 BST。

代码(方案一:转数组)

// Definition for singly-linked list.classListNode(var_x:Int=0){varnext:ListNode=nullvarx:Int=_x}// Definition for a binary tree node.classTreeNode(var_value:Int=0){varvalue:Int=_valuevarleft:TreeNode=nullvarright:TreeNode=null}objectSolution{defsortedListToBST(head:ListNode):TreeNode={// 1. 链表转数组valbuf=scala.collection.mutable.ArrayBuffer.empty[Int]varcur=headwhile(cur!=null){buf+=cur.x cur=cur.next}valarr=buf.toArray// 2. 递归构建平衡 BSTdefbuild(lo:Int,hi:Int):TreeNode={if(lo>hi)nullelse{valmid=(lo+hi)>>>1valnode=newTreeNode(arr(mid))node.left=build(lo,mid-1)node.right=build(mid+1,hi)node}}build(0,arr.length-1)}}

代码(方案二:中序遍历模拟,空间 O(log n))

不额外开数组,用可变的"链表当前节点"指针配合中序递归:

objectSolution{defsortedListToBST(head:ListNode):TreeNode={// 1. 计算链表长度varn=0varp=headwhile(p!=null){n+=1;p=p.next}// 用一个可变的当前链表指针模拟中序遍历varcur:ListNode=headdefbuild(lo:Int,hi:Int):TreeNode={if(lo>hi)nullelse{valmid=(lo+hi)>>>1// 先构建左子树(会消费链表前半部分)valleft=build(lo,mid-1)// 当前链表节点即根valroot=newTreeNode(cur.x)cur=cur.next root.left=left// 再构建右子树root.right=build(mid+1,hi)root}}build(0,n-1)}}

复杂度分析

方案 时间复杂度 空间复杂度
转数组 O(n) O(n)(数组)
中序模拟 O(n) O(log n)(递归栈)

关键点

  1. 中序模拟的核心:先递归左子树,此时链表指针 cur 恰好停在"当前根位置",取完根后指针后移,再递归右子树。这样把"链表的顺序"和"BST 的中序顺序"对齐,无需随机访问。
  2. Scala 的 var cur 闭包捕获:嵌套函数 build 能直接读写外层 var cur,等价于其他语言的 nonlocal / 可变引用,写起来比 Rust 简洁很多。
  3. 1:无符号右移取中点,避免 (lo + hi) 溢出(虽然本题范围安全,但这是好习惯)。

  4. 推荐:方案二空间更优且不依赖额外数组,Scala 中可读性也好,推荐优先掌握。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/26 11:14:55

算法(62):Bellford algorithm的证明,negative weights-18.5

Q:对于每个v,都由相应的处理。对于每个v,都计算过邻边。这个绿色循环,每次都计算了整个图像。但是,这还不够,因为要包含负权重,所以可能出现被计算过的distTo变小的情况,因此还有一个…

作者头像 李华
网站建设 2026/9/26 11:14:48

小游戏包体过大审核驳回?专属优化方案

小游戏包太大审核老被卡?这事儿我太熟了,给你掏心窝子说几句。好多朋友做的小游戏,玩法有意思、功能也全,结果反复被驳回,卡就卡在包体超标上。微信小游戏对安装包和资源包的体积卡得特别死,超了直接不让上…

作者头像 李华
网站建设 2026/9/26 11:14:31

倍福 TwinCAT3 Scope View 示波器添加游标:TaoToken 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/26 11:13:58

甘肃安全员B题库里的案例分析题,背模板不如刷真题

备考甘肃安全员B证的朋友,十个里有八个跟我们吐槽过同一件事:案例分析题背了一堆模板,上了考场发现根本套不进去。题目里的场景一变、问法一换,脑子就空了。问题出在哪儿?不是模板没用,而是安全员B的案例分…

作者头像 李华
网站建设 2026/9/26 11:13:24

基于STM32单片机老人睡眠质量打鼾呼吸频率体温翻身分贝蓝牙无线APP/WiFi无线APP/摄像头视频监控/云平台设计S536

STM32-S536-翻身次数打鼾次数轻重呼吸频率温度睡眠分贝阈值OLED屏声光提醒按键(无线方式选择)产品功能描述:本系统由STM32F103C8T6单片机核心板、OLED屏、(无线蓝牙/无线WIFI/无线视频监控/联网云平台模块-可选)、呼吸频率胸部起伏检测、防水…

作者头像 李华
网站建设 2026/9/26 11:13:13

DeskcommCRM实战:从选型部署到团队落地的客户管理自动化指南

第一次看到DeskcommCRM这个项目名的时候,我脑子里弹出来的画面,是一个整天坐在工位上给客户回消息、记跟进、查订单的商务专员。DeskcommCRM拆开来看,Desk代表桌面/工位,Comm是Communication,合在一起就是在桌面上完成…

作者头像 李华