欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

链表练习,判断环

程序员文章站 2022-06-09 20:19:14
...

题目:给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。

思路;

1、设置快慢指针,假如有环,他们最后一定相遇。

2、两个指针分别从链表头和相遇点继续出发,每次走一步,最后一定相遇于环入口。链表练习,判断环

设表头到入口距离为a,入口到相遇点距离为吧,相遇点到入口距离为c;

相遇时

快指针路程=a+(b+c)k+b ,k>0,慢指针路程=a+b

快指针走的路程是慢指针的两倍,所以:

(a+b)*2=a+(b+c)k+b-->a=(k-1)(b+c)+c,即两个指针分别从链表头和相遇点出发,最后一定相遇于环入口。

/*
 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;
        ListNode p2=pHead;
        while(p2!=null&&p2.next!=null){
            p1=p1.next;
            p2=p2.next.next;
            if(p1==p2) break;
        }
         if(p2==null||p2.next==null) return null;
        p1=pHead; 
        while(p1!=p2){
             p1=p1.next;
             p2=p2.next;
         }
        return p1;
    }
}

 

相关标签: 编程练习