您的位置:首页 > 其它

给定一个有环链表,实现一个算法返回环路的开头结点

2016-11-16 00:00 363 查看
由于如果两个链表如果相交,那么交点之后node都是共享(地址相同)的,因此最简单暴力的方法就是两个for循环,判断该链表的node是否属于另外一个链表。但是这个算法复杂度是O(length1 * length2)。如果链表较长,这个复杂度有点高了。
当然也可以遍历其中某个链表,将node的地址存储hash table中;然后接下来遍历另外一个链表,查找node是否在这个hash table中。这样的话时间复杂度就是O(length1 + length2)。但是需要额外的O(length1)的空间。

/**

* 功能:给定一个有环链表,实现一个算法返回环路的开头结点。

*/

/**

* 思路:fast的移动速度是slow的两倍。当slow走了k个结点进入环路,fast已经进入环路k个结点,即fast和slow

* 相距loop_size -k个结点。

* 再走loop_ -k次后,碰撞,此时距离环路起始处k个结点。

* 链表首部与环路起始处均距离环路起始处k个结点。因此,保持其中一个不变,另一个指向链表首部,相会处

* 即为环路起始处。

*

* 算法:

* 1)创建两个指针,fast和slow。

* 2)slow每走一步,fast走两步。

* 3)碰撞时,将slow指向head,fast保持不变。

* 4)相同速度移动fast和slow,一次一步,返回碰撞结点。

* @param head

* @return

*/

public static LinkedListNode findBeginging(LinkedListNode head){

LinkedListNode slow= head;

LinkedListNode fast= head;

while( fast!= null&& fast. next!= null){

slow= slow. next;

fast= fast. next. next;

if( slow!= fast)

break;

}

if( fast== null|| fast. next== null)

return null;

slow= head;

while( slow!= fast){

slow= slow. next;

fast= fast. next;

}

return fast;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐