博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
剑指offer-链表中环的入口-java实现(思路详细)
阅读量:4283 次
发布时间:2019-05-27

本文共 830 字,大约阅读时间需要 2 分钟。

题目描述:

给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。

思路:1.快慢指针;快慢指针一起从起点开始移动,快指针每次移动两步,慢指针每次移动一步;

2.假设起点到入口点长为y,起点到相遇点长为x,所以相遇点距离入口:x-y;环长为r;

3.快慢指针相遇时:快针走的距离 - 慢针走的距离

即2x - x = nr (快针可能比慢针多走n个环长) => x = nr;

4.相遇后,快指针从头开始以步长为1与慢指针一起移动;

快针移动到入口的距离:y;
慢针移动的距离:x - y + y = x = nr;
所以当两个指针相遇时,相遇点就是环的入口点。

Java实现如下:

public ListNode EntryNodeOfLoop(ListNode pHead)    {
if (pHead == null || pHead.next == null) {
return null; } ListNode p1 = pHead; ListNode p2 = pHead; while (p2 != null && p2.next != null) {
p1 = p1.next; //慢指针一次走一步 p2 = p2.next.next; //快指针一次走两步 if (p1 == p2) {
//快慢指针相遇 p2 = pHead; //相遇后,快指针从头开始移动 while (p1 != p2) {
//两指针步长都为1 p1 = p1.next; p2 = p2.next; } if (p1 == p2) {
//快慢指针再次相遇,相遇点就是环的入口点 return p1; } } } //end while return null; }

转载地址:http://bpdgi.baihongyu.com/

你可能感兴趣的文章
新手入门:零基础理解大型分布式架构的演进历史、技术原理、最佳实践
查看>>
对业务系统的监控
查看>>
异常和数据库事务的几个容易出错的地方
查看>>
eclipse、myEclipse中svn的各种状态图标详解
查看>>
九种跨域方式实现原理(完整版)
查看>>
深入理解applicationContext.xml和dispatcherServlet-servlet.xml区别
查看>>
Redis GEO 的java实现(通过Jedis)(GIS相关)
查看>>
Java读取Properties文件的六种方法
查看>>
聊聊性能:全链路压测 overview
查看>>
Java+Maven+selenium+testng+reportng自动化测试框架(简易搭建说明)
查看>>
WEB模糊查询注意的问题(排除%等通配符并支持不连续关键字查询)
查看>>
PostgreSQL中表的阶层数据取得方法
查看>>
敏捷开发下的B端交互设计流程
查看>>
如何用产品思维迭代项目管理流程?(创业有感)
查看>>
流程不紧扣价值,就是伪流程
查看>>
算法时间空间复杂度学习总结
查看>>
10分钟掌握数据类型、索引、查询的MySQL优化技巧
查看>>
Go 网络编程示例
查看>>
Web指纹识别技术研究与优化实现(CMS)
查看>>
JNI基础知识(java中的一套接口,用来跟c和c++通信)
查看>>