题目的链接在这里:
https://leetcode-cn.com/problems/linked-list-cycle-ii/
题目大意
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。
一、示意图
二、解题思路
java实现
代码如下:
/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode detectCycle(ListNode head) {
//使用双指针,首先判断有没有环,也就是判断快指针会不会到尽头,或者一旦两个到交点,也就是没有尽头
ListNode slow=head;
ListNode fast=head;
boolean isCye=false;
//这里要先.next.next 防止出现fast存在,.next.next不存在
//fast.next不等于null ,但是这样.next.next就可以等于null了
while (fast!=null&&fast.next!=null){
slow=slow.next;
fast=fast.next.next;
//并在其中判断两者是否会相交
if(slow==fast){
isCye=true;
break;
}
//否则一直这样下去
}
//在判断出有环的情况之下
if(isCye){
//这个时候两个已经相交了
//画图比较好理解 slow走了a+b的路程,fast走了2(a+b)的路程,所以整个环也是多走的a+b
//除去A-B的b距离的话,从B走到A 就需要a距离,也就是说slow只需要走a距离,就可以到入口
//而a距离刚好是从起点到A,以slow的方法走的,所以只需要把fast改成slow的方法,重新从起点出发即可
fast=head;
while (fast!=slow){
fast=fast.next;
slow=slow.next;
}
return slow;
}
return null;
}
}