题目
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
知识点
链表
思路
解法一、用ArrayList存ListNode结点,当发现已经存过一次时,则是环的入口,返回此结点,若遍历完后没有重复结点,则返回null;
解法二、利用快慢指针,快指针的速度为2,慢指针速度为1:
所以在第一次相遇后,slow2指针从头结点出发经过长度a,slow经过长度(n-2)b+(n-1)c在y点相遇,此时结点为y,为环的入口结点。
代码
解法一、
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
*/
import java.util.ArrayList;
public class Solution {
public ListNode EntryNodeOfLoop(ListNode pHead)
{
ArrayList<ListNode> ar = new ArrayList<>();
while(pHead!=null){
if(ar.contains(pHead)) return pHead;
ar.add(pHead);
pHead = pHead.next;
}
return null;
}
}
解法二、
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public ListNode EntryNodeOfLoop(ListNode pHead)
{
if(pHead==null|pHead.next==null) return null;
ListNode slow = pHead.next;
ListNode fast = pHead.next.next;
while(fast!=slow){
if(fast==null||fast.next==null)return null;
slow = slow.next;
fast = fast.next.next;
}
ListNode slow2 = pHead;
while(slow2!=slow){
slow = slow.next;
slow2 = slow2.next;
}
return slow;
}
}