力扣小白刷题之109题有序链表转换为二叉搜索树

题目描述

给定一个单链表,其中的元素按照升序排序,将其转换为高度平衡的二叉搜索树。(高度差的绝对值不超过1)

思路

参考自:https://leetcode-cn.com/problems/convert-sorted-list-to-binary-search-tree/solution/you-xu-lian-biao-zhuan-huan-er-cha-sou-suo-shu-by-/

BST的中序遍历是一个升序数组,所以对于升序链表,要将其转换为高度平衡的BST,只需要找到其中间的节点,将中间的节点作为根节点,然后递归的构建左子树和右子树。
对于一个单链表,要找到其中间节点,需要使用快慢指针。

  • 慢指针 slow 每次向后移一个节点
  • 快指针 fast 每次向后移两个节点
  • 当 fast 到链表的末尾时, slow 就访问到链表的中间节点。

对于一个偶数长度的链表,中间两个元素都可用来作为二叉搜索树的根。

  • 当找到链表的中间节点之后,我们将链表从中间节点的左侧断开,做法是使用一个 pre 指针记录 slow 之前的元素,也就是满足 pre.next = slow,断开左侧部分就是让 pre.next = null;
  • 我们只需要将链表的头指针传递给转换函数,进行高度平衡二叉搜索树的转换,所以递归调用的时候,左半部分我们传递原始的头指针,右半部分传递 mid.next(也就是slow.next )作为头指针。

代码

在这里插入图片描述

时间复杂度: O(N logN)
空间复杂度: O(logN)

优化

可以将链表转换为数组。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值