LeetCode142
判断链表有没有环:
思想:快慢指针法,定义两个变量,都指向链表的头结点,一个变量一次移动两个位置,一个节点一次移动一个位置
若一个链表中有环存在,那么这两个变量一定会在环中相遇,这就好比你在操场跑步,跑的快的人一定会在环形跑道中和跑的慢的相遇,只不过是时间问题
public class Solution {
public boolean hasCycle(ListNode head) {
if(head == null){
return false;
}
ListNode fast = head;
ListNode slow = head;
while(fast.next != null && fast.next.next !=null){
fast = fast.next.next;
slow = slow.next;
if(fast == slow){
return true;
}
}
return false;
}
}
求环的入口:
上面只是求出了链表中环的相遇位置,但是这个位置并不是环的入口
我们设链表的开始位置到入环为m,将环设为c环入口到相遇点设为p,相遇点到环的入口设为,通过计算得到:从开始位置到环入口的位置的距离与从相遇点出发到环入口的距离是相等的
public class Solution {
public ListNode detectCycle(ListNode head) {
if(head == null || head.next == null){
return null;
}
ListNode fast = head;
ListNode slow = head;
while(fast.next != null && fast.next.next != null){
fast = fast.next.next;
slow = slow.next;
if(fast == slow){
ListNode i = head;
ListNode j = slow;
while(i != j){
i = i.next;
j = j.next;
}
return j;
}
}
return null;
}
}