. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/linked-list-cycle/description/思路:
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
typedef struct ListNode ListNode;
bool hasCycle(struct ListNode *head) {
//处理链表只有一个节点的情况
if(!head || !head->next)
return false;
//定义两个指针,快慢指针
ListNode* slow = head;
ListNode* fast = head;
while(fast && fast->next)
{
slow = slow->next;
fast = fast->next->next;
if(slow == fast)
{
return true;
}
}
return false;
}
提交结果:
问题思考:
思考1:
慢指针每次走一步,快指针每次走三步,快指针和慢指针一定会相遇,快指针一次走4,5....步最终也会相遇。证明方式和上面一样。
既然快指针不管走几步和慢指针都会相遇,那么我们慢指针每也可以在代码中修改为次走一步,快指针每次走三步。
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
typedef struct ListNode ListNode;
bool hasCycle(struct ListNode* head) {
ListNode *slow, *fast;
slow = fast = head;
while (fast && fast->next) {
slow = slow->next;
int n = 3; // fast每次走三步
while (n--) {
if (fast->next)
fast = fast->next;
else
return false;
}
if (slow == fast) {
return true;
}
}
return false;
}
提交结果:
虽然已经证明了快指针不论走多少步都可以满足在带环链表中相遇,但是在编写代码的时候
会有额外的步骤引入,涉及到快慢指针的算法题中通常习惯使用慢指针走一步快指针走两步
的方式。