2.6

[图片上传中...(image.png-40ee7a-1514103938541-0)]

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

思路

1.检测链表是否存在环路
slowRunner 1步/次,fastRunner 2步/次,一起跑,如果相遇 则有环路

2.什么时候相遇
假设链表起始点到环路起始点为k,当slowRunner跑到环路起始点时,fastRunner跑到了环路起始点后k步,设环路长度为 Loop_Size(暂时不考虑k>Loop_Size 若考虑则 为 mod(k,Loop_Size)),则fastRunner距离slowRunner Loop_Size-k 步也就是距离 环路起始点 Loop_Size-k 步,Loop_Size-k时间后,slowRunner和fastRunner都在环路起始点 Loop_Size-k处,此时相遇,此时他俩距离起始点 Loop_Size-k步,同时,若以环路起始点为终点,他俩距离起始点 k步

3.如何找到环路起始处
链表起始点a 距 环路起始点 b = k步
slow fast相遇处 c 距 环路起始点b = k步
也就是说 把slow放到a,fast还在c,速度现为一致,同时跑, k步后 相遇在 环路起始点b。

代码略。

你可能感兴趣的:(2.6)