2.6问题:
给定一个有环链表,实现一个算法返回环路的开头结点。
思考:
第一:监测链表是否存在环路。有一种简单的方法叫做fastrunner/slowrunner法。fastruner一次移动两步,slowrunner一次移动一步。如果存在环路,最终必然会碰到一起。
第二:什么时候碰到一起?
1、slowrunner处于环路中的0步位置;
2、fastrunner处于环路中的k步位置;
3、slowrunner落后于fastrunner,相距k步;
4、fastrunner落后于slowrunner,相距LOOP_SIZE-k步;
那么,若fastrunner 落后于slowrunner,相距LOOP_SIZE-k步,那么两者将会在LOOP_SIZE-k步之后相遇。此时,两者与环路起始处相距k步,我们将这个位置称为collisionSopt。
第三:如何找到环路起始处?现在我们知道,collisionSpot与环路起始处相距k个结点。即:collisionSpot和linkedListHead与环路起始处均相距k个结点。现在,若用一个指针指向collisionspot,用另一个指针指向linkedlisthead,两者与loopstart相距k个结点。以同样的速度移动,这两个指针会再次碰在一起------这次是在k步之后,此时两个指针都指向loopstart,然后只需返回该结点即可。
算法思路:
1、创建两个指针:fastpointer和slowpointer。
2