给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
说明:不允许修改给定的链表。
解题思路:
- 判断链表是否带环
- 如果带环求入口点,否则返回null
如果单链表有环,那么当fast指针与slow指针相遇时,slow指针肯定没有遍历完链表,而fast指针已经在环内循环了n圈(1≤n)。如果slow指针走了s步,则fast指针走了2s步(fast步数还等于s加上在环上多转的n圈),假设环长为r,则有如下表达式:
/**
* 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 meetNode = isLoop(head);
if (meetNode != null){
ListNode first = head;
ListNode second = meetNode;
while(first != second){
first = first.next;
second = second.next;
}
return first;
}
return null;
}
//判断单链表是否有环
public static ListNode isLoop(ListNode head){
if(head == null || head.next == null){
return null;
}
//初始化slow与fast都指向链表第一个节点
ListNode slow = head;
ListNode fast = head;
while(fast!=null && fast.next!=null){
slow = slow.next;
fast = fast.next.next;
if(slow == fast){
return slow;
}
}
return null;
}
}