题解 | #链表中环的入口结点#

链表中环的入口结点

http://www.nowcoder.com/practice/253d2c59ec3e4bc68da16833f79a38e4

public ListNode EntryNodeOfLoop(ListNode pHead)
{
//暴力哈希
// HashSet<listnode> hash = new HashSet<listnode>();
// while(pHead!=null)
// {
// if(hash.Contains(pHead)==true)
// return pHead;
// else {
// hash.Add(pHead);
// pHead = pHead.next;
// }
// }
// return null;
//经典快慢指针解法,也是本题一般考察的目的
ListNode slow = pHead;
ListNode fast = pHead;
if(pHead ==null)return null;
bool flag = false;
while(fast!=null && fast.next!=null)//因为是一次走两步,所以要fast.next!=null防止越界
{
slow = slow.next;
fast = fast.next.next;
if(fast == slow)
{
flag = true;
break;//说明存在环
}
}
if(flag == false)return null;//单链表,返回null
//现在,slow跟fast都在相遇点
//由S(fast) = 2S(slow)化简得到公式,可得关系式(具体的自己推导一下),于是有:
slow = pHead;
while(slow!=fast)
{
slow = slow.next;
fast = fast.next;
}
return slow;
}</listnode></listnode>

全部评论

相关推荐

10-01 09:50
门头沟学院 Java
肖先生~:这个人真的很好,点赞
点赞 评论 收藏
分享
RajahnRan:公司赚到了,这可是一眼就手写出来的代码,ai都写不出来
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务