/*
题目:
如果链表中包含环,如何找出环的入口?
*/
/*
思路:
双指针:
1、判断是否有环。
fast指针一次2步,slow指针一次1步,当fast与slow相遇时,说明有环。
2、判断环路中节点的个数。
当fast和slow相遇的节点在环上,一个指针固定,
另一个指针循环一周再次遇到该固定指针,遍历的个数即为节点个数。
3、找到入口节点。
fast指针先走k步,
接着,fast和slow指针同时遍历,
相遇节点即为入口节点。
*/
#include<iostream>
#include<string.h>
#include<algorithm>
#include<cmath>
#include<stdio.h>
using namespace std; struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
}; int LoopNodeLength(ListNode* pHead){
int length = 0;
ListNode* slow = pHead;
ListNode* fast = pHead->next;
if(fast == nullptr) return length; while(fast->next != nullptr && fast != slow){
fast = fast->next->next;
slow = slow->next;
}
if(fast->next != nullptr){
fast = slow->next;
length = 1;
while(fast != slow){
length++;
fast = fast->next;
}
}
return length; }
ListNode* EntryNodeOfLoop(ListNode* pHead)
{
if(pHead == nullptr) return nullptr;
int length = LoopNodeLength(pHead);
if(length == 0) return nullptr; ListNode* fast = pHead;
ListNode* slow = pHead;
for(int i = 0; i < length; i++){
fast = fast->next;
}
while(fast != slow){
fast = fast->next;
slow = slow->next;
}
return slow;
} int main(){
ListNode* node1 = new ListNode(1);
ListNode* node2 = new ListNode(2);
ListNode* node3 = new ListNode(3);
node1->next = node2;
node2->next = node3;
node3->next = node1;
cout<<EntryNodeOfLoop(node1)->val<<endl;
}

  

剑指offer-面试题23-链表中环的入口节点-双指针的更多相关文章

  1. 剑指offer(55)链表中环的入口节点

    题目描述 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. 题目分析 1.一快一慢指针,先找到碰撞点. 2.然后碰撞点到入口节点的距离就是头结点到入口节点的距离. 具体原理可 ...

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

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

  3. 【剑指Offer】55、链表中环的入口结点

      题目描述:   给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null.   解题思路:   本题是一个比较典型的链表题目,难度适中.首先,对于大多人来说,看到这道题是比较开心的 ...

  4. 剑指offer 面试题 删除链表中重复的节点

    题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后 ...

  5. C++版 - 剑指offer 面试题23:从上往下打印二叉树(二叉树的层次遍历BFS) 题解

    剑指offer  面试题23:从上往下打印二叉树 参与人数:4853  时间限制:1秒  空间限制:32768K 提交网址: http://www.nowcoder.com/practice/7fe2 ...

  6. 剑指Offer:面试题15——链表中倒数第k个结点(java实现)

    问题描述 输入一个链表,输出该链表中倒数第k个结点.(尾结点是倒数第一个) 结点定义如下: public class ListNode { int val; ListNode next = null; ...

  7. 剑指offer——面试题23:链表中环的入口节点

    函数: ListNode* MeetingNode(ListNode* pHead) { if(pHead==nullptr) return nullptr; ListNode* quickNode= ...

  8. 剑指Offer:面试题23——从上往下打印二叉树(java实现)

    问题描述: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 思路: 按照层次遍历的方法,使用队列辅助. 1.将根结点加入队列. 2.循环出队,打印当前元素,若该结点有左子树,则将其加入队列,若 ...

  9. 【剑指offer 面试题23】从上往下打印二叉树

    思路: 没啥好说的,BFS. C++: #include <iostream> #include <queue> using namespace std; struct Tre ...

随机推荐

  1. ELK搭建(docker环境)

    ELK是Elasticsearch.Logstash.Kibana的简称,这三者是核心套件,但并非全部. Elasticsearch是实时全文搜索和分析引擎,提供搜集.分析.存储数据三大功能:是一套开 ...

  2. Qt 中 this->size() this->rect() event->size() 三者差异

    测试代码: void OsgEarthGraphicsView::resizeEvent(QResizeEvent* event) { //if (scene()) //{ // scene()-&g ...

  3. java架构之路-(微服务专题)ribbon的基本使用和内部算法的自我实现

    上次回归: 上次我们主要说了,我们的注册中心nacos的使用,如我们的命名空间.分组.集群.版本等是如何使用的,如果是这样呢?我们现在有三个用户服务和三个订单服务,我们应该如何分发这些请求呢?都请求到 ...

  4. hive执行计划简单分析

    原始SQL: select a2.ISSUE_CODE as ISSUE_CODE, a2.FZQDM as FZQDM, a2.FZQLB as FZQLB, a2.FJJDM as FJJDM, ...

  5. Shell脚本 小程序演示

    一般的shell编程 场景贯穿了几个熟知的步骤: ●显示消息●获取用户输入●存储值到文件●处理存储的数据 这里写一个小程序 包含以上几部 #!/bin/bash while true do #echo ...

  6. 5分钟看懂系列:HTTP缓存机制详解

    原创文章首发于公众号:「码农富哥」,欢迎收藏和关注,如转载请注明出处! 什么是HTTP缓存 HTTP 缓存可以说是HTTP性能优化中简单高效的一种优化方式了,缓存是一种保存资源副本并在下次请求时直接使 ...

  7. 自己用C语言写NXP S32K116 serial bootloader

    了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 每次我有了新的EVA ...

  8. 献给即将35岁的初学者,焦虑 or 出路?

    导言:“对抗职场“35 岁焦虑”,也许唯一的方法是比这个瞬息万变的商业社会跑得更快!” 一直以来,都有许多人说“程序员或测试员是个吃青春饭的职业”,甚至还有说“35 岁混不到管理就等于失业”的言论. ...

  9. Win10的Python3.8升级与安装

    一.前言 1.说明 博主电脑Python3.6用了有3年多了,正好疫情期间有时间,给更新到3.8版本,边安装边记录下安装流程,希望对读者有帮助 2.系统环境 联想电脑,系统Win10,上一个Pytho ...

  10. console控制台的用法

    参考链接:https://developer.mozilla.org/zh-CN/docs/Web/API/Console 1,console.log('a'); 2,console.dir(xx); ...