剑指Offer:链表中环的入口节点【23】
剑指Offer:链表中环的入口节点【23】
题目描述
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
题目分析
第一步确定链表中是否包含环,怎么确定呢?我们定义两个指针橙和蓝,橙每次走一步,蓝每次走两步,如果他俩重合了,这就说明链表中存在环。

第二步求环的长度,两者碰头后,让其中一个继续走,每走一步步数加一,然后求得环的长度。
第三步求环的初始节点,仍然是两个指针,其中一个事先走环长个节点,然后两者同时移动,直到两者碰头,然后那个节点就是环的初始节点。

Java题解
public static ListNode EntryNodeOfLoop(ListNode pHead)
{
//确定是否有环
if(isCircle(pHead))
{
//求环的长度
int len =getLenOfCircle(pHead);
ListNode pA = pHead;
ListNode pB = pHead;
for(int i=0;i<len;i++)
{
pB=pB.next;
}
while (pA.val!=pB.val)
{
pA=pA.next;
pB=pB.next;
}
return pA;
}
return null;
}
//确定是否有环
public static boolean isCircle(ListNode pHead)
{
try {
ListNode pA = pHead.next;
ListNode pB = pHead.next.next;
while (pA != null && pB != null && pA.val != pB.val) {
pA = pA.next;
pB = pB.next.next;
}
return true;
}catch (Exception e)
{
return false;
}
}
//求环的长度
public static int getLenOfCircle(ListNode pHead)
{
ListNode pA = pHead.next;
ListNode pB = pHead.next.next;
while (pA != null && pB != null && pA.val != pB.val) {
pA = pA.next;
pB = pB.next.next;
}
int length = 1;
while (pB.next.val!=pA.val)
{
pB=pB.next;
length++;
}
return length;
}
巧妙的方法
import java.util.*;
public class Solution {
public ListNode EntryNodeOfLoop(ListNode pHead)
{
if(pHead==null)
return null;
ListNode pNode=pHead;
HashSet<ListNode> pSet = new HashSet<ListNode>();
while(pNode!=null){
if(!pSet.add(pNode))
return pNode;
pNode=pNode.next;
}
return null;
}
}
剑指Offer:链表中环的入口节点【23】的更多相关文章
- python剑指offer 链表中环的入口节点
题目: 一个链表中包含环,请找出该链表的环的入口结点. 思路: 先说个定理:两个指针一个fast.一个slow同时从一个链表的头部出发, fast一次走2步,slow一次走一步,如果该链表有环,两个指 ...
- 剑指Offer——链表中环的入口结点
题目描述: 一个链表中包含环,请找出该链表的环的入口结点. 分析: 设置两个指针p1,p2, 两个指针都从链表的头部开始走,不过p1每次走一步,p2每次走两步. 直到相遇的时候,p2走的长度是p1的两 ...
- 剑指offer 链表中环的入口位置
题目描述 一个链表中包含环,请找出该链表的环的入口结点. 思路:这题需要知道a = c,然后head和slow每次走一步,相遇的时候就是第一个入口交点, 注意:for循环或者while循环之后,一 ...
- 剑指offer-链表中环的入口节点
题目描述 一个链表中包含环,请找出该链表的环的入口结点. 解题思路 解决这个问题的第一步是如何确定一个链表中包含环.可以定义两个指针,同时从链表的头结点出发,一个指针一次走一步,另一个一次走两步.如果 ...
- 141. Linked List Cycle&142. Linked List Cycle II(剑指Offer-链表中环的入口节点)
题目: 141.Given a linked list, determine if it has a cycle in it. 142.Given a linked list, return the ...
- 【剑指offer】面试题 23. 链表中环的入口节点
面试题 23. 链表中环的入口节点
- C++实现查找链表中环的入口节点
/* * 寻找链表中环的入口节点.cpp * * Created on: 2018年4月10日 * Author: soyo */ #include<iostream> using nam ...
- php实现找链表中环的入口节点(画图、看评论)
php实现找链表中环的入口节点(画图.看评论) 一.总结 画图.看评论 二.php实现找链表中环的入口节点 题目描述: 一个链表中包含环,请找出该链表的环的入口结点. 三.代码 第一步,找环中相汇点. ...
- 剑指Offer-链表中环的入口结点
package LinkedList; import java.util.HashSet; /** * 链表中环的入口结点 * 一个链表中包含环,请找出该链表的环的入口结点. */ public cl ...
随机推荐
- 别名alias——快捷方式
有时候在 linux 或者 windows 上面需要对相关的命令进行快捷处理,这时候可以用到别名—— alias : linux别名设置假设我们需要设置一个 dockers 命令,用来替代 doc ...
- 【spring boot】9.spring boot+spring-data-jpa的入门使用,实现数据持久化
spring-data-jpa官方使用说明文档:https://docs.spring.io/spring-data/jpa/docs/current/reference/html/ spring-d ...
- 深入Java----集合----BitSet
BitSet类 大小可动态改变, 取值为true或false的位集合.用于表示一组布尔标志. java中有三种移位运算符 << : 左移运算符,num <&l ...
- json lib 2.4及其依赖包下载
下载文件地址:https://files.cnblogs.com/files/xiandedanteng/json-lib-2.4%26dependencies_jars.rar 它包括 common ...
- vue install 注册组件
1.myPlugin.js文件 let MyPlugin = {}; MyPlugin.install = function (Vue, options) { // 1. 添加全局方法或属性 Vue. ...
- 总结自己使用shell命令行经常使用到的8个小技巧
原创blog,转载请注明出处 Shell是命令解释器 [root@localhost ~]# cat /etc/shells 查看本系统共支持哪些shell 1 tab 命令补全 这个差点儿每次都能用 ...
- 目标主体名称不正确,无法生成 SSPI 上下文。
参考地址:http://blog.csdn.net/burgess_liu/article/details/18300959 两个命令:setspn -L Server03 和 setspn -D S ...
- Exception from HRESULT: 0x80070057 (E_INVALIDARG)
Exception from HRESULT: 0x80070057 (E_INVALIDARG)异常. 解决方案:清除ASP.NET缓存目录中对应的应用程序目录. ASP.NET缓存目录如下: C: ...
- Java 实现对Sql语句解析
原文地址:http://www.cnblogs.com/zcftech/archive/2013/06/10/3131286.html 最近要实现一个简易的数据库系统,除了要考虑如何高效的存储和访问数 ...
- HTTP状态码中301与302的区别
301 Moved Permanently 被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个URI之一.如果可能,拥有链接编辑功能的客户端应当自动把请求的地址修改 ...