剑指offe55--链表中环的入口结点

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;    
    }
}

猜你喜欢

转载自blog.csdn.net/zj15527620802/article/details/83352643