NC3 链表中环的入口结点
[https://www.nowcoder.com/practice/253d2c59ec3e4bc68da16833f79a38e4?tpId=188&&tqId=38577&rp=1&ru=/activity/oj&qru=/ta/job-code-high-week/question-ranking]
/*返回链表的环的入口结点即可,我们后台程序会打印这个结点对应的结点值;若没有,则返回对应编程语言的空结点即可。
示例1
输入:
{1,2},{3,4,5}
返回值:
3
说明:
返回环形链表入口结点,我们后台程序会打印该环形链表入口结点对应的结点值,即3
示例2
输入:
{1},{}
返回值:
"null"
说明:
没有环,返回对应编程语言的空结点,后台程序会打印"null"
示例3
输入:
{},{2}
返回值:
2
说明:
环的部分只有一个结点,所以返回该环形链表入口结点,后台程序打印该结点对应的结点值,即2
*/
struct ListNode* EntryNodeOfLoop(struct ListNode* a ) {
// write code here
if(!a||!a->next)
return NULL;
struct ListNode* front=a;//快指针
struct ListNode* rear=a;//慢指针
while(front&&front->next){
front=front->next->next;
rear=rear->next;
if(front==rear){
break;
}
}//结束1是不是环,结束2是有环且快与慢相遇
if(!front||!front->next)//判断是不是有环
return NULL;
struct ListNode* head=a;//题倒是不难,但是你能相信有这个定理,当有环的时候,快慢指针相遇,在到链表头指针和慢指针走一样的长度,最后会在环开始节点相遇woc
while(head!=rear){
rear=rear->next;
head=head->next;
}
return rear;
}