力扣刷题-热题100题-第26题(c++、python)

142. 环形链表 II - 力扣(LeetCode)https://leetcode.cn/problems/linked-list-cycle-ii/?envType=study-plan-v2&envId=top-100-liked

哈希法

c++中有unordered_set,python中有set,作为哈希的集合,遍历链表时,若当前指针在集合中就说明有环,返回当前指针,否则将指针加入集合,最后若是正常退出循环表示没有环,返回NULL。

复制代码
//c++
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        unordered_set<ListNode*> a;
        while(head)
        {
            if(a.count(head))   return head;
            a.insert(head);
            head=head->next;
        }
        return NULL;
    }
};

#python
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def detectCycle(self, head: Optional[ListNode]) -> Optional[ListNode]:
        a=set()
        while(head):
            if head in a:
                return head
            a.add(head)
            head=head.next
        return None

快慢指针

如上图所示,两个指针同时从head出发,一个指针s每次走一步,一个指针f每次走两步。

若有环则有s的两倍是f走的距离,即 2*(a+b)=a+n*(b+c)+b,所以有a=(n-1)(b+c)+c。其中(b+c)是环的大小,可省略则有a=c,所以s与f相遇后,再来一个指针head从头出发,s指针继续一步一步走,两个相遇的地方就是入环的地方。

若无环则有f为NULL。

所以大循环是f是否为NULL,在循环里再去判断是否有环并找到入环的地方。

复制代码
//c++
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        if(!head||!head->next)  return NULL;
        ListNode* f=head;
        ListNode* s=head;
        while(f)
        {
            if(!f->next||!f->next->next)    return NULL;
            f=f->next->next;
            s=s->next;
            if(f==s)
            {
                while(s!=head)
                {
                    s=s->next;
                    head=head->next;
                }
                return s;
            }
        }
        return NULL;
    }
};

#python
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def detectCycle(self, head: Optional[ListNode]) -> Optional[ListNode]:
        if head==None or head.next==None:
            return None
        s=head
        f=head
        while f:
            if f.next==None or f.next.next==None:
                return None
            s=s.next
            f=f.next.next
            if s==f:
                while s!=head:
                    s=s.next
                    head=head.next
                return s
        return None
相关推荐
团子的二进制世界2 分钟前
G1垃圾收集器是如何工作的?
java·jvm·算法
Max_uuc6 分钟前
【C++ 硬核】打破嵌入式 STL 禁忌:利用 std::pmr 在“栈”上运行 std::vector
开发语言·jvm·c++
白日做梦Q6 分钟前
Anchor-free检测器全解析:CenterNet vs FCOS
python·深度学习·神经网络·目标检测·机器学习
吃杠碰小鸡6 分钟前
高中数学-数列-导数证明
前端·数学·算法
故事不长丨6 分钟前
C#线程同步:lock、Monitor、Mutex原理+用法+实战全解析
开发语言·算法·c#
long3167 分钟前
Aho-Corasick 模式搜索算法
java·数据结构·spring boot·后端·算法·排序算法
近津薪荼8 分钟前
dfs专题4——二叉树的深搜(验证二叉搜索树)
c++·学习·算法·深度优先
熊文豪16 分钟前
探索CANN ops-nn:高性能哈希算子技术解读
算法·哈希算法·cann
喵手20 分钟前
Python爬虫实战:公共自行车站点智能采集系统 - 从零构建生产级爬虫的完整实战(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·采集公共自行车站点·公共自行车站点智能采集系统·采集公共自行车站点导出csv
喵手27 分钟前
Python爬虫实战:地图 POI + 行政区反查实战 - 商圈热力数据准备完整方案(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·地区poi·行政区反查·商圈热力数据采集