题目描述
对于一个给定的链表,返回环的入口节点,如果没有环,返回null。
解法
快慢指针法。
1.设置快指针fast和慢指针slow。
2.快指针一次移动两步,慢指针一次移动一步,则快慢指针一定会在环中相遇。
3.一个指针从环中的相遇点出发,另一个指针从链表的头部出发,则一定会在环的入口节点相遇。
代码实现
/**
* 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) {
if(head == null){
return null;
}
ListNode fast = head, slow = head;
boolean flag = false;
while(fast != null && fast.next != null){
fast = fast.next.next;
slow = slow.next;
if(fast == slow){
flag = true;
break;
}
}
if(!flag){
return null;
}
//一个指针从相交点出发,另一个指针从头结点开始
//会在环的入口节点相遇
fast = head;
while(true){
if(fast == slow){
break;
}
fast = fast.next;
slow = slow.next;
}
return fast;
}
}