题目描述
给定一个链表,返回循环开始的节点。如果没有循环节点,return NULL,并且要求在不占用额外空间的情况下解决
解题思路
(1)快慢节点确定是否会相交,若循环,则快慢指针会相交,若不循环,则快指针会指向空
(2)若相交,记录慢指针位置,并让快指针回到头结点,两指针再一起走,第一个相交点,为循环开始的节点
代码示例
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
if (head == NULL || head->next == NULL) {
return NULL;
}
ListNode *p = head;
ListNode *q = head;
//快指针一次走两步,可能当前为空,或next为空,都算走到最后一个节点,否则循环体内p走两步会出错
p = p->next->next;
q = q->next;
if (p == q) break;
}
//对应上面的while循环条件
p = head;
while (p != q) {
p = p->next;
q = q->next;
}
return p;
}
};