代码改变世界

寻找有环单链表的交叉点

2009-08-03 13:45  Jvpy  阅读(596)  评论(0)    收藏  举报
寻找有环单链表的交叉点|计算有环单链表的节点数

有一道著名的面试题目是判断一个单链表中是不是存在环,做法是用两个指针从头节点出发,一个每次一步,一个每次两步,如果相遇则说明有环。有天我就很自然的想到了标题的这个问题,即寻找如何图中e的位置。 

                p<--o<--n<--m<--l<--k
                |                   ^
                v                   |
a-->b-->c-->d-->e-->f-->g-->h-->i-->j

                                   
注意到对于没有“尾巴”的有n个节点的有环单链表,这两个指针一定是在走了n步之后在起点相遇,则对于有尾巴的情况,两指针的相遇点即交叉点往"后"退尾巴的长度。比如上图所示的情况,两指针的相遇点为m点。这么标题的问题就好解决了:在两指针相遇后,让其中一指针从头节点出发,另外一指针从相遇点出发,则下一次相遇点即交叉点。对于无尾巴的情况,即第0步就是。做到这里,很容易就可以计算出链表的节点数。只是感性的推论,哪天证明一下。