题目描述:

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

思路分析:

这道题首先需要判断链表是否存在环,很快就能想到用快慢指针来判断。

由于快慢指针的相遇位置并不一定为链表环的入口结点,需要进一步判断。这里参考了一个博客 https://www.cnblogs.com/likeio/p/3593686.html ,由于快指针和慢指针相遇时,快指针一定比慢指针多走了n(n=1, 2, ...)个环,可以通过列对应关系得知,在已知有环的情况下,两个指针分别以头结点和相遇结点为起点,步长为1前进,一定会在环的入口结点相遇。

需要注意是,在找入口结点时,首先需要判断头结点和相遇结点是否相等,再进行后续判断,否则对于头结点即为入口结点的情况会遗漏。

代码:

 /*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* pHead)
{
if(pHead==nullptr)
return nullptr;
ListNode* walker;
ListNode* runner;
walker = pHead;
runner = pHead;
while(walker!=nullptr && runner!=nullptr)
{
walker = walker->next;
if(runner->next==nullptr)
return nullptr;
else
runner = runner->next->next;
if(runner==walker)
break;
}
if(walker == runner)
{
walker = pHead;
while(walker!=nullptr && runner!=nullptr)
{
if(runner==walker)
break;
walker = walker->next;
runner = runner->next;
}
if(walker==runner)
return walker;
else
return nullptr;
}
else
return nullptr;
}
};

最新文章

  1. iOS 学习 - 17.Socket
  2. MongoDb 创建、更新以及删除文档常用命令
  3. C++中关于文件的读写
  4. Bat脚本实现MySQL数据库SQL文件备份
  5. const in C++
  6. HDU 1080
  7. 3. Windows根据端口查进程---ADB 相关报错 ADB server didn't ACK cannot bind ':5037'
  8. WebSocket在ASP.NET MVC4中的简单实现 (该文章转自网络,经尝试并未实现,请大神指点。)
  9. 学习笔记--Grunt、安装、图文详解
  10. NOI2009植物大战僵尸
  11. eclipse更改主题
  12. Android开发周报:Flyme OS开源、经典开源项目解析
  13. 如何利用多核CPU来加速你的Linux命令 — awk, sed, bzip2, grep, wc等(转)
  14. C#私房菜[二][提供编程效率的技巧]
  15. 操作系统-实验一、DOS使用命令实验
  16. 出错信息:Incorrect string value: '\xE4\xBD\xA0\xE5\xA5\xBD' for column 'username'
  17. 关于SSH的那些事
  18. View在测量时的MeasureSpec由什么决定?
  19. fopen() 返回 NULL, 奇葩原因:当前进程打开多个句柄,忘记关闭。(bug)
  20. Guava:好用的java类库 学习小记

热门文章

  1. kthread_run
  2. 使用TP5验证器遇到的坑
  3. IDEA中安装及配置SVN
  4. H3C 802.11 MAC层工作原理
  5. Mac电脑永久路由的添加方法是是什么? Mac校园网连接教程
  6. java 计算两个日期间的所有日期
  7. Centos7 Mysql主从双机热备的实战记录
  8. jQ native 构造函数
  9. centos7安装yum安装pip
  10. vue 选择之单选,多选,反选,全选,反选