1 题目
题目:带环链表(Linked List Cycle)
描述:给定一个链表,判断它是否有环。
- 链表长度不超过10000
lintcode题号——102,难度——medium
样例1:
输入:linked list = 21->10->4->5,then tail connects to node index 1(value 10).
输出:true
解释:链表有环。
样例2:
输入:linked list = 21->10->4->5->null
输出:false
解释:链表无环。
2 解决方案
2.1 思路
找环的问题可以通过以下方式来解决,使用两个指针从链表头开始,慢指针一次走一步,快指针一次走两步,如果链表中有环,则快慢指针终会相遇,如果快指针走到链表尾部依然没有遇到慢指针,则链表不带环。
2.3 时间复杂度
时间复杂度为O(n)。
2.4 空间复杂度
空间复杂度为O(1)。
3 源码
细节:
- 快、慢指针同时从链表头出发,若能相遇必有环。
- 注意快指针移动的时候要先验证有效性。
C++版本:
/**
* Definition of singly-linked-list:
* class ListNode {
* public:
* int val;
* ListNode *next;
* ListNode(int val) {
* this->val = val;
* this->next = NULL;
* }
* }
*/
/**
* @param head: The first node of linked list.
* @return: True if it has a cycle, or false
*/
bool hasCycle(ListNode * head) {
// write your code here
if (head == nullptr)
{
return false;
}
ListNode * slow = head;
ListNode * fast = head;
while (fast != nullptr && fast->next != nullptr)
{
slow = slow->next;
fast = fast->next->next;
if (slow == fast)
{
return true; // 快慢指针能够相遇,则必定有环
}
}
return false;
}