题2
题目链接:返回环形链表的环入口点
本题的解题方法仍是用快慢指针,当快慢指针在环内相遇时,用一个指针从相遇点开始走,一个指针从链表的头节点开始走,二者的相遇点就是环的入口点。
详细代码如下:
typedef struct ListNode ListNode;
struct ListNode *detectCycle(struct ListNode *head) {
if(head==NULL||head->next==NULL){ /特殊情况,当链表为空或者只有一个节点时
return NULL; /不可能有环
}
ListNode*fast=head,*slow=head;
ListNode*left=head,*right;
while(fast&&fast->next){
fast=fast->next->next;
slow=slow->next;
if(fast==slow) /快慢指针相遇
{
right=slow;
while(left!=right){ /一个指针从后开始走,一个指针从相遇点开始走
left=left->next;
right=right->next;
}
return left; /二者相遇点即是环入口
}
}
return NULL;
}