给定一个链表,如果链表中存在环,则返回到链表中环的起始节点的值,如果没有环,返回null。
给出 -21->10->4->5, tail connects to node index 1,返回10
/**
* Definition for ListNode.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int val) {
* this.val = val;
* this.next = null;
* }
* }
*/
/*
思路:
首先,利用快慢指针判断有无环,若遇到slow == fast时,跳出循环;
然后,调整fast=head,slow不变,此时slow与fast同步移动,直至再次相遇,即是链表中环的起始节点。
首先跟Linked List Cycle一样,还是快慢指针,从头开始走,如果没有相遇快指针就走到尾了,则说明没有环,返回NULL
如果相遇了,把慢指针重新放到开头,快慢指针一起一步一步走再次相遇即是环的入口,不要问我为什么...想知道的可以去看一下数学证明
*/
public class Solution {
public ListNode detectCycle(ListNode head) {
// write your code here
if(head == null || head.next == null) return null;
ListNode slow = head;
ListNode fast = head;
while(fast!=null && fast.next != null){
slow = slow.next;
fast = fast.next.next;
if(slow == fast){
break;
}
}
if(fast!=null && fast == slow)
{
fast = head;
while(fast != slow)
{
fast = fast.next;
slow = slow.next;
}
//相等
return fast;
}//if
return null;
}
}