快速查找长度未知的单链表的中间结点
2015-07-12 20:31
393 查看
在小甲鱼的《数据结构与算法》上,看到的一道企鹅的面试题。
我想到的方法比普通的方法要快,但不是最快的。
普通方法:先遍历单链表,获取长度后,再找到中间结点。假设长度是L,则所需时间为O(L)+O(L/2) = O(3/2L)
我想到的方法:因为想到要获取中间结点,那必须知道长度啊,因此遍历单链表是必需的,在遍历时,将每个结点的值放在数组中,遍历结束知道长度后,从数组中取中间长度的值即可,需要的时间为O(L)。(因为单链表长度未知,所以初始化数组时就比较麻烦,如果初始数组的长度比单链表的长度短,那就需要动态数组,这样时间开销就不是O(L)了,该方法有不确定性)
小甲鱼讲的方法:快慢指针法,定义2个指针,一个快指针,一个慢指针,快指针的步长是慢指针的2倍,从头开始遍历链表,当快指针到尾时,慢指针正好指向链表的中间结点,该方法需要的时间为O(1/2L)
我想到的方法比普通的方法要快,但不是最快的。
普通方法:先遍历单链表,获取长度后,再找到中间结点。假设长度是L,则所需时间为O(L)+O(L/2) = O(3/2L)
我想到的方法:因为想到要获取中间结点,那必须知道长度啊,因此遍历单链表是必需的,在遍历时,将每个结点的值放在数组中,遍历结束知道长度后,从数组中取中间长度的值即可,需要的时间为O(L)。(因为单链表长度未知,所以初始化数组时就比较麻烦,如果初始数组的长度比单链表的长度短,那就需要动态数组,这样时间开销就不是O(L)了,该方法有不确定性)
小甲鱼讲的方法:快慢指针法,定义2个指针,一个快指针,一个慢指针,快指针的步长是慢指针的2倍,从头开始遍历链表,当快指针到尾时,慢指针正好指向链表的中间结点,该方法需要的时间为O(1/2L)
相关文章推荐
- Keil V5.1x命令“Build Target”重新编译所有文件
- pdf转txt或则doc(pdfBox)
- string类的实现
- Android核心分析之GUI框架的原理
- js匿名函数实现递归调用
- 一键安装ORACLE并建库脚本
- scikit-learn:加载自己的原始数据
- Oracle 数据迁移(从Oracle11G迁移到更高的版本号Oracle10G低版本号)
- 用PHP向数据库中实现简单的增删改查(纯代码)
- 算法设计与分析
- Log4j日志级别
- MySQL系列之E-2------MySQL主从复制实战
- 详解 UIView 的 Tint Color 属性
- 学习技巧总结
- 字符串与时间之间的转换
- 数据库 -- MYSQL免安装操作方法
- windows下创建文件夹链接
- Memcahce(MC)系列(三)Memcached它PHP转让
- 查询hadoop参数变量
- linux下C语言socket网络编程简例-(转载)