链表练习,判断环
程序员文章站
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;
}
}
下一篇: 求1到10的阶乘