【链表与数组】Lintcode 102. 带环链表

Lintcode 102. 带环链表

题目描述:给定一个链表,判断它是否有环。
在这里插入图片描述
这道题如果使用额外空间的话,可以借用set,每走过一个点就放到set中,当走着走着再次碰到之前的点了就说明有环。下面使用不耗费额外空间的方法:快慢指针实现。
解题思路:
快慢指针的经典题。 快指针每次走两步,慢指针一次走一步。 在慢指针进入环之后,快慢指针之间的距离每次缩小1,所以最终能相遇。

/**
 * Definition of singly-linked-list:
 * class ListNode {
 * public:
 *     int val;
 *     ListNode *next;
 *     ListNode(int val) {
 *        this->val = val;
 *        this->next = NULL;
 *     }
 * }
 */

class Solution {
    
    
public:
    /**
     * @param head: The first node of linked list.
     * @return: True if it has a cycle, or false
     */
    bool hasCycle(ListNode * head) {
    
    
        ListNode *fast, *slow;
        if (nullptr == head) {
    
    
            return false;
        }
        
        slow = head;
        fast = head->next;
        while (nullptr != fast && nullptr != fast->next) {
    
    
            if (slow == fast) {
    
    
                return true;
            }
            slow = slow->next;
            fast = fast->next->next;
        }
        return false;
    }
};

猜你喜欢

转载自blog.csdn.net/phdongou/article/details/113819758