判断是否有环和查找中间节点
使用两个指针,p1每次前进1个节点,p2每次前进2个节点,如果链表有环,则最后两个指针指向的节点将会重合,若无环,则p2最后将走到链表尾,当p2走到链表尾时,p1指向的节点就是中间节点
检测环的入口
当p1p2重合以后,让p2回到表头,步长设为1重新开始走,当p1p2再次重合时,重合点即为环入口
证明:
如图表头到环入口长度为l1,环的长度为l2,环的入口为h点,p2p1第一次重合点为h'点,设hh'长度为l3,则有
在第一次重合时
p1走过的路程 = l1 + l3
p2走过的路程 = l1 + l3 + n * l2 = 2 * (l1+l3)
=> l2 = (l1 + l3) / n # n为p2在环上走过的圈数
p2速度置为1重新走起,当走过l1的路程时到达环入口
p1此时也走过l1的路程, 则从环口开始,p1共走过的路程为 l1 + l3 + l1 - l1 = l1 + l3(减去了表头到环口路程) = n * l2 正好走了n圈到达环口
故p1,p2第二次重合时就是在环口
检测链表是否相交
将其中一个链表首尾相连,检测另一个链表是否存在环,如果存在则相交,环的入口即为两个链表的交点