比较好的企业网站,asp个人网站下载,广西网站建设推荐,建设云个人证件查询系统文章目录 一、题目二、C# 题解 一、题目 给定一个链表#xff0c;如果它是有环链表#xff0c;实现一个算法返回环路的开头节点。若环不存在#xff0c;请返回 null。 如果链表中有某个节点#xff0c;可以通过连续跟踪 next 指针再次到达#xff0c;则链表中存在环。 为了… 文章目录 一、题目二、C# 题解 一、题目 给定一个链表如果它是有环链表实现一个算法返回环路的开头节点。若环不存在请返回 null。 如果链表中有某个节点可以通过连续跟踪 next 指针再次到达则链表中存在环。 为了表示给定链表中的环我们使用整数 pos 来表示链表尾连接到链表中的位置索引从 0 开始。 如果 pos 是 -1则在该链表中没有环。注意pos 不作为参数进行传递仅仅是为了标识链表的实际情况。 点击此处跳转题目。 
示例 1 输入head  [3,2,0,-4], pos  1 输出tail connects to node index 1 解释链表中有一个环其尾部连接到第二个节点。 示例 2 输入head  [1,2], pos  0 输出tail connects to node index 0 解释链表中有一个环其尾部连接到第一个节点。 示例 3 输入head  [1], pos  -1 输出no cycle 解释链表中没有环。 进阶 
你是否可以不用额外空间解决此题 
二、C# 题解 使用快慢指针 p、q 依次遍历可以证明当快慢指针相交时此时慢指针 p 和头指针 head 前进相交处即为环路开头节点 
/*** Definition for singly-linked list.* public class ListNode {*     public int val;*     public ListNode next;*     public ListNode(int x) {*         val  x;*         next  null;*     }* }*/
public class Solution {public ListNode DetectCycle(ListNode head) {if (head  null) return null;ListNode p  head, q  p;//  快慢指针相交do {if (p ! null) p  p.next;if (q ! null) q  q.next;if (q ! null) q  q.next;} while (p ! q);if (p  null) return null; // 检查空// 寻找环路开头节点while (p ! head) {p  p.next;head  head.next;}return p;}
}时间复杂度 O ( n ) O(n) O(n)。空间复杂度 O ( 1 ) O(1) O(1)。