版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zj15527620802/article/details/83352643
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
做这个题之前,我们应该先明白链表有环是什么的样的情况,理解的什么链表中有环的样子,我们就可以来理解这个题的思路的。这个题分两步:
1:先定义两个节点p1,p2,分别指向链表的头结点,我们让p2每次移动两个节点,让p1每次移动一个节点,如果链表中有环,p1肯定会遇到p2,p1==p2,,如果链表长度为n,实际上,p1==p2的时候,p2比p1多走了kn步,这里可以通过画图来理解。这样我们就找到了p1和p2相遇的节点。
2,当p2==p1,我们让p2再次指向头结点,然后再次让p1和p2每次移动一个节点,直到相遇,此时便是环的入口处。
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public ListNode EntryNodeOfLoop(ListNode pHead)
{
ListNode p1=pHead,p2=pHead;
while(p2.next!=null&&p2.next.next!=null) {
p1=p1.next;
p2=p2.next.next;
if(p1==p2) {
p2=pHead;
while(p1!=p2) {
p1=p1.next;
p2=p2.next;
}
return p1;
}
}
return null;
}
}