题目描述
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
思路
两种方法,其一用双指针,一个走两步,一个走一步。确定有环并得出节点数,再走一圈就是入口。
其二,用hashset,set里面逐个加节点,遇到重复的就是入口。
代码
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public ListNode EntryNodeOfLoop(ListNode pHead)
{
ListNode l = pHead, r = pHead;
boolean flag = false;
// 判断有环
while(l != null && l.next != null){
l = l.next;
r = r.next.next;
if( l == r){
flag = true;
break;
}
}
if(!flag) return null;
// 得出节点数
int n = 1;
r = r.next;
while(l != r){
r = r.next;
n++;
}
// r先走n个,l开始走,碰到就是入口
l = r = pHead;
for(int i=0; i<n; i++){
r = r.next;
}
while(l!=r){
l = l.next;
r = r.next;
}
return l;
}
}