题目
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
牛客网给定以下链表类。
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
*/
分析
思路一:
如上图例子,我们要确定链表中环的入口结点,我们应首先确定该链表中是否有环,这一步可以用前面的题用到过的双指针法,即一个快指针一个慢指针,快指针步长为2,慢指针步长为1,都从头遍历,如果没有环的话,两个指针永不会相遇,否则就会相遇,此时判断为有环;其次如果有环的话我们应数出环中的结点个数len;最后如下图,将快指针和慢指针重新归为到pHead,让快指针先走len步,然后再将两个指针一起遍历,相遇的结点便是链表中环的入口结点。
时间复杂度:o(N)
空间复杂度:o(1)
代码:
public class Solution {
public ListNode EntryNodeOfLoop(ListNode pHead)
{
//输入空结点判断
if(pHead==null) return null;
//1.判断是否有环
ListNode fast = pHead, slow = pHead;
boolean flag = false;
while(fast!=null && fast.next!=null){
slow = slow.next;
fast = fast.next.next;
if(fast==slow){
flag = true;
break;
}
}
if(!flag){
return null;
} else{
//2.数出环的结点个数
fast = fast.next;
int len = 1;
while(fast!=slow){
fast = fast.next;
len++;
}
//3.找出环的入口结点
fast = slow = pHead;
for(int i=0;i<len;i++){
fast = fast.next;
}
while(fast!=slow){
fast = fast.next;
slow = slow.next;
}
return slow;
}
}
}