给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null
。
说明:不允许修改给定的链表。
进阶:
你是否可以不用额外空间解决此题?
分析:
我最开始想的是通过修改value值来判断是否相遇,后来看见题目规定不能修改,遂凉凉。
用快慢指针解答,至于为什么能够相遇,我也没仔细看,详情见博客点击打开链接,他是用的java,本人用的C。
声明:
代码难免有不足之处,持续更新ing
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode *detectCycle(struct ListNode *head) {
if(head == NULL)
return NULL;
struct ListNode *fast = head;
struct ListNode *slow = head;
//判断有没有环
while(true){
//fast移动两步
if(fast->next != NULL)
fast = fast->next;
else
return NULL;
if(fast->next != NULL)
fast = fast->next;
else
return NULL;
//slow移动一步
slow = slow->next;
//判断相遇
if(slow == fast){
//相遇了就把fast移动到最开始
fast = head;
//退出循环
break;
}
}
//判断相遇节点
while(true){
if(fast == slow){
return fast;
}
fast = fast->next;
slow = slow->next;
}
}