题解 | #链表中环的入口结点#
链表中环的入口结点
https://www.nowcoder.com/practice/253d2c59ec3e4bc68da16833f79a38e4
根据两个结论设置两个方法完成:
结论一:设置快慢两个指针,(V(p1) = 2 ,V(p2) = 1 ),当存在环时一定会相遇。
结论二:将两个相同速度(V(p) = 1)的指针从起始点和相遇点进行移动,最终的相遇点就是环入口。
/** * struct ListNode { * int val; * struct ListNode *next; * }; */ /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param pHead ListNode类 * @return ListNode类 */ //相遇点 #include <stdio.h> struct ListNode* FindEncounterNode(struct ListNode* pHead){ struct ListNode* fast = pHead; struct ListNode* slow = pHead; struct ListNode* encount_point = NULL; while(fast!=NULL && fast->next!=NULL){ fast = fast ->next->next; slow = slow->next; if(fast == slow){ return encount_point = fast; } } return NULL; } //进入点 struct ListNode* FindEnterNode(struct ListNode* pHead1,struct ListNode* pHead2){ struct ListNode* p1 = pHead1; struct ListNode* p2 = pHead2; struct ListNode* enter_point = NULL; while(p1!=p2){ p1 = p1->next; p2 = p2->next; } enter_point = p1; return enter_point; } struct ListNode* EntryNodeOfLoop(struct ListNode* pHead ) { // write code here struct ListNode* p_encounter = pHead; struct ListNode* p_resul = pHead; //寻找相遇点 p_encounter = FindEncounterNode(p_encounter); if (!p_encounter) return p_encounter; //寻找进入点 p_resul = FindEnterNode(p_resul,p_encounter); return p_resul; }