给六人游做网站开发的,王占山战斗英雄简历,专做火影黄图的网站,asp网站如何安装题目
给定一个链表的头节点 head #xff0c;返回链表开始入环的第一个节点。 如果链表无环#xff0c;则返回 null。 如果链表中有某个节点#xff0c;可以通过连续跟踪 next 指针再次到达#xff0c;则链表中存在环。 为了表示给定链表中的环#xff0c;评测系统内部使…题目
给定一个链表的头节点 head 返回链表开始入环的第一个节点。 如果链表无环则返回 null。 如果链表中有某个节点可以通过连续跟踪 next 指针再次到达则链表中存在环。 为了表示给定链表中的环评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置索引从 0 开始。如果 pos 是 -1则在该链表中没有环。注意pos 不作为参数进行传递仅仅是为了标识链表的实际情况。 不允许修改 链表。 示例 1 示例 2
示例 3 提示 链表中节点的数目范围在范围 [0, 104] 内 -105 Node.val 105 pos 的值为 -1 或者链表中的一个有效索引
解析
定义头节点到环的入口为x入口到相遇点为y相遇点到入口为z
怎么确定链表是否有环
定义快指针每次移动两个位置慢指针每次移动一个位置那么根据相当运动来说慢指针不动快指针每次动一个单位所以如果有环则快指针一定可以追上慢指针也可也列出下面图片中的式子
怎么找到环的入口
上述推导可以发现在相遇之后如果从相遇点出发宁外一个指针从链表的头节点出发那么他们相遇的位置就是环的入口
代码
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:ListNode *detectCycle(ListNode *head) {ListNode *fasthead;ListNode *slowhead;// 1.双指针寻找相遇点while(fast!NULLfast-next!NULL){slowslow-next;fastfast-next-next;// 2.快慢指针相遇寻找环的入口if(fastslow){ListNode *index1fast;ListNode *index2head;while(index1!index2){index1index1-next;index2index2-next;}return index2;}}return NULL;}
};通过