牛客NC4-判断链表中是否有环

这篇博客探讨了如何判断一个链表中是否存在环。提供了两种解决方案:一种使用哈希表,空间复杂度为O(n),另一种采用快慢指针,空间复杂度为O(1)。快慢指针法通过双速移动指针,若存在环,两者最终会相遇;若无环,快指针将先到达空指针。
摘要由CSDN通过智能技术生成

题目描述

判断给定的链表中是否有环

扩展:

你能给出空间复杂度O(1)的解法么?

 

C++

1.空间复杂度O(n),利用哈希表,存在环即当前节点的next已经在哈希表中出现过

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
#include <unordered_map>
class Solution {
public:
    bool hasCycle(ListNode *head) {
        unordered_map<ListNode*, int> listmap;
        if(head == nullptr)
            return false;
        ListNode* pNow = head;
        while(pNow != nullptr){
            auto it = listmap.find(pNow);
            if(it != listmap.end()){//找到了,存在环
                return true;
            }
            else{
                listmap[pNow]++;
            }
            pNow = pNow->next;
        }
        return false;
    }
};

2.空间复杂度O(1),快慢指针,快指针每次走2步,慢指针每次走一步,如果存在环则运行一定次数后快慢指针会相等。不存在环,快指针会先指向nullptr。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    bool hasCycle(ListNode *head) {
        ListNode* fast = head;
        ListNode* slow = head;
        while(fast != nullptr && fast->next != nullptr ){//快指针每次走2步,慢指针每次走一步
            fast = fast->next->next;
            slow = slow->next;
            if(slow == fast)
                return true;
        }
        return false;
    }
};

 

牛客 a卷2022年第四季度的华为题目,要求考生设计一种高效的数据结构,能够支持以下几种操作: 1. 添加一个元素 2. 删除一个元素 3. 查找是否存在某个元素 4. 返回元素的总数 该数据结构要求满足空间复杂度较小、时间复杂度较低、能够快速地进行查找和修改等多种操作。 想要编写这样一种数据结构,我们可以参考许多已有的经典算法与数据结构,如二叉树、哈希表、红黑树等,通过综合利用它们的优点来实现这个问题的解决。 例如,我们可以通过哈希表来存储所有元素的值,并在每个哈希链表的元素再使用红黑树来进行排序与查找。这样,我们既能够轻松地进行元素的添加和删除操作,也能够在查找较大数据范围和数量时保持较高的速度与效率。同时,由于使用了多个数据结构来协同完成这个问题,我们也能够在空间复杂度上适度地进行优化。 当然,在具体设计这个数据结构的过程,我们还需要考虑一些实践的细节问题,例如如何避免哈希冲突、如何处理数据丢失与被删除元素所占用的空间等问题,这都需要相应的算法与流程来进行处理。 总体来看,设计这种支持多种操作的高效数据结构,需要我们具备丰富的算法知识和编程实践能力,同时需要我们在具体处理问题时能够将多种算法和数据结构进行有效地结合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

给你一颗小瓜子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值