分两步:第一步判断有没有环:条件是p!=null且p.next !=null这样p最后只会有两种情况,在链表的最末尾,与在链表的末尾空节点处。,一旦末尾节点的下一位为空p==null或者p就是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 ){
return null;
}
ListNode p = pHead,q = pHead;
while (q != null && q.next != null ){
p = p.next;
q = q.next.next;
if(p == q){
break;
}
}
//不存在环返回空
if(q == null || q.next == null){
return null;
}
//两者的相遇点到入口点的位置刚等于头节点到入口的位置,
//则再设一个指针从头节点与当前指针相同速度往前走相遇即可
ListNode start = pHead;
while(start != p){
p = p.next;
start = start.next;
}
return p;
}
}