题目描述

一个链表中包含环,请找出该链表的环的入口结点。

解题思路

解决这个问题的第一步是如何确定一个链表中包含环。可以定义两个指针,同时从链表的头结点出发,一个指针一次走一步,另一个一次走两步。如果走得快的指针走到了链表的末尾都没有追上第一个指针,那么链表就不包含环。反之则可得到环中的一个节点。

第二步是如何找到环的入口。还是可以用两个指针P1和P2指向链表的头结点,如果链表中的环有n个节点,则指针P1先在链表上向前移动n步,然后两个指针依次同时向前移动一步。当P2指向环的入口节点时,P1已经围绕着环走了一圈,又回到了入口节点。

剩下的问题是如何得到环中节点的数目。可以从第一步得到的环中节点开始每次走一步,计数走的步数直到它又回到原来的位置,就可以得到环中节点数了。

代码

 /*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* pHead)
{
int len = LenOfLoop(pHead);
if(len == )
return NULL;
else{
ListNode* first = pHead;
ListNode* second = pHead;
while(len-- > )
first = first->next;
while(first != second){
first = first->next;
second = second->next;
}
return first;
}
}
int LenOfLoop(ListNode* pHead){ //得到环的长度
ListNode* first = pHead->next;
if(first != NULL)
first = first->next;
ListNode* second = pHead;
while(first != NULL){ //first每次走两步,second走一步,找到两者相等的节点即为环中节点
if(first == second){
break;
}
else{
first = first->next;
if(first != NULL)
first = first->next;
second = second->next;
}
}
if(first != NULL){
ListNode* loop = first;
int len = ;
while(loop != first->next){
first = first->next;
len++;
}
return len;
}
else
return ;
}
};

剑指offer-链表中环的入口节点的更多相关文章

  1. python剑指offer 链表中环的入口节点

    题目: 一个链表中包含环,请找出该链表的环的入口结点. 思路: 先说个定理:两个指针一个fast.一个slow同时从一个链表的头部出发, fast一次走2步,slow一次走一步,如果该链表有环,两个指 ...

  2. 剑指Offer——链表中环的入口结点

    题目描述: 一个链表中包含环,请找出该链表的环的入口结点. 分析: 设置两个指针p1,p2, 两个指针都从链表的头部开始走,不过p1每次走一步,p2每次走两步. 直到相遇的时候,p2走的长度是p1的两 ...

  3. 剑指offer 链表中环的入口位置

    题目描述 一个链表中包含环,请找出该链表的环的入口结点.   思路:这题需要知道a = c,然后head和slow每次走一步,相遇的时候就是第一个入口交点, 注意:for循环或者while循环之后,一 ...

  4. 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 ...

  5. 剑指Offer:链表中环的入口节点【23】

    剑指Offer:链表中环的入口节点[23] 题目描述 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. 题目分析 第一步确定链表中是否包含环,怎么确定呢?我们定义两个指针橙和 ...

  6. 【剑指offer】面试题 23. 链表中环的入口节点

    面试题 23. 链表中环的入口节点

  7. C++实现查找链表中环的入口节点

    /* * 寻找链表中环的入口节点.cpp * * Created on: 2018年4月10日 * Author: soyo */ #include<iostream> using nam ...

  8. php实现找链表中环的入口节点(画图、看评论)

    php实现找链表中环的入口节点(画图.看评论) 一.总结 画图.看评论 二.php实现找链表中环的入口节点 题目描述: 一个链表中包含环,请找出该链表的环的入口结点. 三.代码 第一步,找环中相汇点. ...

  9. 剑指Offer-链表中环的入口结点

    package LinkedList; import java.util.HashSet; /** * 链表中环的入口结点 * 一个链表中包含环,请找出该链表的环的入口结点. */ public cl ...

随机推荐

  1. c#多线程同步之lock

    一提起lock,想必大家都很熟悉,因为它易用,顾名思义,就是一把锁,常用于多线程的同步,一次只允许一个线程进入.最近遇到一个很诡异的bug. private static readonly objec ...

  2. c#开发wps插件(3)部署

    上一篇,我们完成了具体的开发工作,但是最终必须得部署到客户机器上.所以,部署方面,我花费了一些时间去研究,现在总结下.上一篇中,我为什么建议开发人员安装wps专业版呢?因为装了专业版,方便我们开发,安 ...

  3. UWP:使用Composition实现类似安卓的水波纹Ripple效果

    先放效果图: 首先,建立一个RippleHelper.cs文件,然后建立以下附加属性: IsFillEnable:是否扩大到整个控件 RippleDuration:持续时间 RippleRadius: ...

  4. Fiddler抓取https设置及其原理

    iddler抓取https设置及其原理 2018-02-02 目录 1 HTTPS握手过程2 Fiddler抓取HTTPS过程3 Fiddler抓取HTTPS设置参考 数字签名是什么? 1 HTTPS ...

  5. Python之list列表方法详解

    # 列表test = [11, 22, 33, 44, 55, 22]# append方法,在test列表末尾增加一个元素# append(self, p_object) 参数:p_object:待添 ...

  6. 2018-3 WebStorm最新版本破解方法

    今天重新打开WebStorm发现之前输入的License Server没法用了,不能通过WebStorm的检测,搜索良久,终于找到了最新版本WebStorm的破解方法. 在激活页面选择License ...

  7. 网站转变风格的css变化

    网站换肤,是一个比较老的话题了,理论很清晰,就是要根据js 来变换文件加载的css文件,根据需求来加载不同的css文件,有了这个基础就很明确要怎么做了,但是实际上还要记录当前用户的cookie  保证 ...

  8. mac下利用Breakpad的dump文件进行调试

    一.前情回顾 最近把公司的一个视频处理程序更新了一个版本,准备提交测试的发现了崩溃的情况.这个程序采用Qt和ffmpeg技术栈开发,主要用于对视频进行渲染拼接处理,在Windows和mac两个平台同时 ...

  9. BiLstm与CRF实现命名实体标注

    众所周知,通过Bilstm已经可以实现分词或命名实体标注了,同样地单独的CRF也可以很好的实现.既然LSTM都已经可以预测了,为啥要搞一个LSTM+CRF的hybrid model? 因为单独LSTM ...

  10. 【MySQL】MySQL零碎积累

    MySQL零碎积累 ■ 在给MySQL添加新用户时可以这么操作: create user 'newUser' identified by 'password'; grant all privilege ...