链表——有序链表化为平衡二叉查找树
2016-05-09 14:16
190 查看
比较直观的解法是自顶向下的递归解决,先找到中间节点作为根节点,然后递归左右两部分。所以我们需要先找到中间节点,题目中要求如果链表结点数为偶,则中间结点为两个中间结点的后一个。对于单链表来说,必须要遍历一边,可以使用快慢指针加快查找速度。
代码如下:
代码如下:
public TreeNode sortedListToBST(ListNode head) { if(head == null) return null; if(head.next == null){ return new TreeNode(head.val); } //用快慢指针找到中间节点 ListNode slow = head; ListNode fast = head; ListNode preSlow = null; while(fast!= null&&fast.next!=null){ preSlow = slow; slow = slow.next; fast = fast.next; if(fast!=null&&fast.next!=null) { fast=fast.next; } } //分别递归左右两部分 TreeNode mid = new TreeNode(slow.val); if(preSlow != null){ preSlow.next = null; mid.left = sortedListToBST(head); } if(slow.next != null){ mid.right = sortedListToBST(slow.next); } return mid; }
相关文章推荐
- 一致性哈希算法与C++实现
- 【JAVA 动态创建风水罗盘 超精华Swing项目方案-项目目录 - 文章03】
- charles mock 接口异常
- 百度地图API之Marker的使用(Android)
- WebView下载文件
- Redis3.0常用命令列表
- 问题分析(1)性能问题
- 安卓 MediaPlayer 获取MP3 播放时长有关问题
- 图片裁剪出有效内容得部分
- CodeForces 590B Chip 'n Dale Rescue Rangers
- UIImagePickerController
- Erlang 之文件处理总结
- 0029-java NIO
- 用idea查看tomcat源码
- 度量快速开发平台中附件字段介绍
- 解释内存中的栈、堆和静态存储区的用法?
- cxf与struts2拦截器冲突的解决方案
- 备份
- 短发
- windows7环境下安装基于Theano的Keras