142环形链表Ⅱ
返回链表开始入环的第一个节点
给定一个链表的头节点head,返回链表开始入环的第一个节点。如果链表无环,则返回null
如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数pos来表示链表尾连接到链表中的位置(索引从0开始)。如果pos是-1,则在该链表中没有环。注意:pos不作为参数进行传递,仅仅是为了标识链表的实际情况。
不允许修改链表
输入:head = [3,2,0,-4] ,pos = 1
输出:返回索引为1的链表节点
解释: 链表中有一个环,其尾部连接到第二个节点。
输入:head = [1,2],pos = 0
输出:返回索引为0的链表节点
解释:链表中有一个环,其尾部连接到第一个节点
输入: head = [1] ,pos = -1
输出: 返回null
解释: 链表中没有环
解题思路:
当快慢指针在链表中相遇的时候,说明链表中有环,找到了链表中的环,重新将慢指针指向头节点,然后快慢指针继续移动,为了找到环的开始节点,将快慢指针的移动节点都变成移动一个节点
/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
/**
*@author 火拳
*
*/
public class Solution{
public ListNode detectCycle(ListNode head){
if(head == null) return null
ListNode slowPtr = head,fastPtr = head;
boolean Flagloop = false;
while(fastPtr.next != null && fastPtr.next.next !=null){
slowPtr = slowPtr.next;
fastPtr = fastPtr.next.next;
if(fastPtr == slowPtr){
Flagloop = true;
break;
}
}
if(Flagloop){//环存在
slowPtr = head;
while(slowPtr != fastPtr){
fastPtr = fastPtr.next;
slowPtr = slowPtr.next;
}
return slowPtr; //返回开始的节点
}
return null;
}
}
问题解决