判断一个链表有没有环,找出链表里面环的第一个入口点

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.判断相不相交可以转化为上面的的问题,让其中一个链表守卫相连就转化成  有没有环的问题。


给你一个单链表,怎么样让遍历一遍,找出位于中间的元素?

也是一样的,一个走两步,一个走一步。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值