快速查找长度未知的单链表的中间结点

来源:互联网 发布:手机淘宝扫一扫 编辑:程序博客网 时间:2024/04/30 03:01

在小甲鱼的《数据结构与算法》上,看到的一道企鹅的面试题。


我想到的方法比普通的方法要快,但不是最快的。


普通方法:先遍历单链表,获取长度后,再找到中间结点。假设长度是L,则所需时间为O(L)+O(L/2) = O(3/2L)

我想到的方法:因为想到要获取中间结点,那必须知道长度啊,因此遍历单链表是必需的,在遍历时,将每个结点的值放在数组中,遍历结束知道长度后,从数组中取中间长度的值即可,需要的时间为O(L)。(因为单链表长度未知,所以初始化数组时就比较麻烦,如果初始数组的长度比单链表的长度短,那就需要动态数组,这样时间开销就不是O(L)了,该方法有不确定性)


小甲鱼讲的方法:快慢指针法,定义2个指针,一个快指针,一个慢指针,快指针的步长是慢指针的2倍,从头开始遍历链表,当快指针到尾时,慢指针正好指向链表的中间结点,该方法需要的时间为O(1/2L)

0 0