力扣小白刷题之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)
优化
可以将链表转换为数组。