判断链表是否有环并返回入环起始位置
题目链接
**思路:**首先使用快慢指针判断链表是否有环,如果存在环,即fast==slow。以当前慢指针作为起点再走一圈,当下次相遇时,返回slow。如果链表不存在环,返回null。
快慢指针的妙用:
快慢指针主要用于解决链表问题。快慢指针中,因为每一次移动后,快指针都会比慢指针多走一个节点,所以他们之间在进入环状链表后,不论相隔多少个节点,慢指针总会被快指针赶上并且重合,此时就可以判断必定有环。
代码展示:
/**
* 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 fast,slow;
fast=slow=head;
while(fast!=null&&fast.next!=null){
fast=fast.next.next;
slow=slow.next;
if(fast==slow){
slow=head;
while(slow!=fast){
slow=slow.next;
fast=fast.next;
}
return slow;
}
}
return null;
}
}