判断是否有环和查找中间节点

使用两个指针,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第二次重合时就是在环口

 

检测链表是否相交

将其中一个链表首尾相连,检测另一个链表是否存在环,如果存在则相交,环的入口即为两个链表的交点

 

posted on 2012-08-15 21:49  ZimZz  阅读(687)  评论(0编辑  收藏  举报