题解 | #判断链表中是否有环#

判断链表中是否有环

https://www.nowcoder.com/practice/650474f313294468a4ded3ce0f7898b9

本题有两种方法:

第一种:使用「集合」容器进行存储,当需要检测元素是否存在时,调用容器的 find方法
C++ 可以使用unordered_set, python 可以使用 set
python 的 in 关键字让代码的含义简单直接

第二种:使用快慢指针,一个快一个慢,如果存在环的话,这两个指针一定会相遇

美观的代码:
CPP代码


可复制的代码:

class Solution {
public:
    bool hasCycle1(ListNode *head) {
        // 思路分析:
        // 所谓的“环”,其实只是一个节点的下一个节点恰好是之前出现的节点
        // 可以将之前出现过得节点都存储起来
        // 由于只是检测 存在性, 所以可以使用包含 find方法的容器
        // 但是这样子的话,空间复杂度为 O(n)
        // 真的存在空间复杂度为 O(1)的方法吗?
        unordered_set<ListNode*> set_;

        while (head != nullptr) {
            set_.emplace(head);
            head = head->next;
            if (set_.find(head) != set_.end()) {
                return true;
            }
        }

        return false;
    }
    // 使用快慢指针的方法    
    bool hasCycle(ListNode *head) {
        ListNode *slow = head;
        ListNode *fast = head;
        while (fast && fast->next) {
            slow = slow->next;
            fast = fast->next->next;
            if (slow == fast) return true;
        }

        return false;
    }
};
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务