1.hash。把每个节点的地址放到键值对里。hash地址即可。O(n)
2.暴力
3.快慢指针,这里说一下为什么慢指针进入环里面后还没走完一圈就会相遇,其实很好理解,快指针肯定会追上他,如果慢指针走上一圈了。那么快指针必然已经追上他了。
慢的走S,快的走了2S
S=a+x, 2S=S+nr 快的比慢的多跑n圈。
S=nr
nr=(n-1)r +r=S r=L-a
所以:L-a+(n-1)r =S a移过去 a = L-S+(n-1)r = L-a-x+(n-1)r
注意:为什么说在相遇点放一个指针,在头结点放一个指针,然后同时走,一步一步走,他们相遇的点就是入口节点。
原因是这样:上面的公式说了,a的距离就是n-1圈再加上相遇点的后半部分, 让相遇点的那个指针先走n-1圈,此时它相当于没走,还是在原位置的。再走后半部分,走完后刚好是距离a。所以说,相遇点就是入口点。
拓展;
说两个单链表有没有相交:
1.两个都遍历到最后看想不想等。
2.找出相交的第一个节点。
a.压栈,栈顶相同同时出战,直到不同为止。 b.遍历一遍这两个链表算出长度,然后让长的先走一些,然后一起走,每次走一步,相等的点就是入口点。
3.判断相不相交可以转化为上面的的问题,让其中一个链表守卫相连就转化成 有没有环的问题。
给你一个单链表,怎么样让遍历一遍,找出位于中间的元素?
也是一样的,一个走两步,一个走一步。