当前位置: 首页 > news >正文

给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。(C++实现,非常简单明了)

题目介绍

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

题目分析

这是一个典型的链表中查找环的问题,基本思路是,首先设置两个快慢指针slow和fast,并且快指针fast每次前进两步,慢指针slow每次前进一步,假定当相遇的时候,设慢指针在环中走了k步,设环之外的部分长为x,环的长度为c,则快指针一共走了:

x+b1∗c+kx+b_1*c+kx+b1c+k步,(b1b_1b1为快指针在环中走的圈数)

慢指针一共走了:
x+b2∗c+kx+b_2*c+kx+b2c+k步,(b2b_2b2为快指针在环中走的圈数)

因为快指针的速度是慢指针的两倍。那么可以得到:

2∗(x+b2∗c+k)==x+b1∗c+k2*(x+b_2*c+k)== x+b_1*c+k2(x+b2c+k)==x+b1c+k

得到xxxm∗c−km*c-kmck ,其中m=b1−2∗b2m=b_1-2*b_2m=b12b2,慢指针在圈中还剩下的步数c−kc-kck。我们可以发现,如果此时让快指针设置为从原点开始,每次只前进一步,那么由于xxxm∗c−km*c-kmck,慢指针剩下的步数也只剩c−kc-kck,这样,如果两个指针同时出发的话,最终一定会相遇的。这时,慢指针有可能已经走了m-1圈,并在环的入口处和快指针相撞,此时求出该相遇的点即可。详细内容请见源代码。

源代码

/*
struct ListNode {int val;struct ListNode *next;ListNode(int x) :val(x), next(NULL) {}
};
*/
class Solution {
public:ListNode* EntryNodeOfLoop(ListNode* pHead){if(pHead==NULL||pHead->next==NULL){return NULL;}ListNode* slow=pHead;ListNode* fast=pHead;while(fast!=NULL&&fast->next!=NULL){slow=slow->next;fast=fast->next->next;if(slow==fast){fast=pHead;while(fast!=slow){fast=fast->next;slow=slow->next;}if(fast==slow){return slow;}}}return NULL;}
};

http://www.taodudu.cc/news/show-1782053.html

相关文章:

  • 【physx/wasm】在physx中添加自定义接口并重新编译wasm
  • excel---常用操作
  • Lora训练Windows[笔记]
  • linux基础指令讲解(ls、pwd、cd、touch、mkdir)
  • InnoDB 事务处理机制
  • 启明云端ESP32 C3 模组WT32C3通过 MQTT 连接 AWS
  • 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1-2-3-3-4-4-5 处理后为 1-2-5(非常简单明了)
  • 请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
  • 使用国内源来安装pytorch(速度很快)
  • 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为...
  • 地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。
  • python自动搜索最佳超参数之GridSearchCV函数
  • 请实现一个函数,将一个字符串中的每个空格替换成...
  • 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
  • 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
  • 3D Bounding Box Estimation Using Deep Learning and Geometry
  • Deep manta算法解析
  • GS3D An Efficient 3D Object Detection Framework for Autonomous Driving算法解析
  • python机器学习库xgboost使用调参
  • LightGBM算法解析
  • 机器学习模型之集成算法
  • ESPNet: Efficient Spatial Pyramid of Dilated Convolutions for Semantic Segmentation(自动驾驶领域轻量级模型)
  • 中缀表达式转后缀表达式(非常简单易懂)
  • 后缀表达式转中缀表达式(非常简单易懂)
  • 给定一列非负整数,求这些数连接起来能组成的最大的数。
  • 努力找工作中。。。
  • 手撕代码之快速排序算法(简单明了)
  • 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。
  • 小Q正在给一条长度为n的道路设计路灯安置方案。 为了让问题更简单,小Q把道路视为n个方格,需要照亮的地方用'.'表示, 不需要照亮的障碍物格子用'X'表示。
  • 牛牛以前在老师那里得到了一个正整数数对(x, y), 牛牛忘记他们具体是多少了。 但是牛牛记得老师告诉过他x和y均不大于n, 并且x除以y的余数大于等于k。 牛牛希望你能帮他计算一共有,,,
  • C++实现选择排序
  • C++实现希尔排序
  • 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示,,,
  • CatBoost之算法解析(Kaggle常用模型)
  • ElasticNet算法解析
  • SVM支持向量机算法详解