力扣刷题:单链表OJ篇(下)

embedded/2024/12/29 8:43:47/

大家好,这里是小编的博客频道
小编的博客:就爱学编程

很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!!

目录

  • 1.环形链表
    • (1)题目描述
    • (2)解题思路
    • (3)复杂度分析
  • 2.环形链表2
    • (1)题目描述
    • (2)解题思路
    • (3)复杂度分析
  • 快乐的时光总是短暂,咱们下篇博文再见啦!!!如果小编的文章会对你有帮助的话不要忘了,记得给小编点赞、收藏支持一下,在此非常感谢!!!

在这里插入图片描述


废话不多说,我们直接看题。

1.环形链表

(1)题目描述

在这里插入图片描述
在这里插入图片描述


(2)解题思路

快慢指针

但要注意:最好使得快指针fast 一次走两步,慢指针slow 一次走一步使得两指针的速度之差为1 。这样就不可能会出现有环不相交的问题。

代码实现:

bool hasCycle(struct ListNode *head) {//快慢指针看是否会相遇,但最好快指针一次走两步,慢指针一次走一步,就不会出现有环却不相遇的情况struct ListNode* fast = head, * slow = head;if(head == NULL) return false;while(fast && fast->next){fast = fast->next->next;slow = slow->next;if(fast == slow){return true;}}return false;
}

(3)复杂度分析

  • 时间复杂度:O(N),其中 N 是链表中的节点数。
  • 空间复杂度:O(1)。我们只使用了两个指针的额外空间。

2.环形链表2

(1)题目描述

在这里插入图片描述
在这里插入图片描述


(2)解题思路

思路一:先找到相交点再把相交的点next指针指向空,这样就转变成了头指针head 和·相遇点的next 指针找交点问题。

代码实现:

 struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {if (headA == NULL || headB == NULL) {return NULL;}struct ListNode *p1 = headA, *p2 = headB;while (p1 != p2) {p1 = p1 == NULL ? headB : p1->next;p2 = p2 == NULL ? headA : p2->next;}return p1;
}struct ListNode *detectCycle(struct ListNode *head) {if (head == NULL) return NULL;struct ListNode* fast = head, * slow = head;while (fast && fast->next) {//先走,防止因为头指针相等fast = fast->next->next;slow = slow->next;if (fast == slow) {struct ListNode* ptr = fast->next;fast->next = NULL;return getIntersectionNode(ptr, head);}}return NULL;
}

思路二:借助定理——两个快慢指针他们相交于环内一位置,而一指针从该位置开始走,同时另一从链表的头结点开始走,它们最终会第一次相交于环开始的那个节点。(怎么得到这个定理的一定要掌握,因为HR问到会问这个)

定理推导:

  • 我们使用两个指针,fast slow。它们起始都位于链表的头部。随后,slow 指针每次向后移动一个位置,而 fast 指针向后移动两个位置。如果链表中存在环,则 fast 指针最终将再次与 slow 指针在环中相遇。
  • 设链表中环外部分的长度为 aslow 指针进入环后,又走了 b 的距离与 fast 相遇。此时,fast 指针已经走完了环的 n 圈,因此它走过的总距离为 a + n(b + c) + b = a + (n + 1)b + nc
  • 根据题意,任意时刻,fast 指针走过的距离都为 slow 指针的 2 倍。因此,我们有a + (n + 1)b + nc = 2(a + b)⟹a = c + (n−1)(b + c)
  • 有了a = c + (n−1)(b + c)的等量关系,我们会发现:从相遇点到入环点的距离加上 n−1 圈的环长,恰好等于从链表头部到入环点的距离
  • 因此,当发现 slow fast相遇时,我们再额外使用一个指针 ptr。起始,它指向链表头部;随后,它和 slow 每次向后移动一个位置。最终,它们会在入环点相遇。

代码实现:

struct ListNode *detectCycle(struct ListNode *head) {//这题要做出就一定要推出一个定理:两个快慢指针他们相交于环内一位置,而一指针从该位置开始走,同时另一从链表的头结点开始走,它们最终会第一次相交于环开始的那个节点。(怎么得到这个定理的一定要掌握,因为HR问到会问这个)struct ListNode* fast = head, * slow = head;if (head == NULL) return NULL;while (fast && fast->next) {//先走,防止因为头指针相等fast = fast->next->next;slow = slow->next;if (fast == slow) {struct ListNode* ptr = head;while(ptr != slow){ptr = ptr->next;slow = slow->next;}return ptr;}}return NULL;
}

(3)复杂度分析


快乐的时光总是短暂,咱们下篇博文再见啦!!!如果小编的文章会对你有帮助的话不要忘了,记得给小编点赞、收藏支持一下,在此非常感谢!!!


http://www.ppmy.cn/embedded/149690.html

相关文章

电商矩阵运营服务器怎么选

在电商行业,随着业务的快速发展,越来越多的企业开始构建电商矩阵,以实现多元化运营和精准营销。然而,电商矩阵的运营离不开高效、稳定的服务器支持。在众多服务器选项中,弹性云服务器凭借其独特的优势,成为…

C++创建型模式之原型模式

C 原型模式(Prototype Pattern) 1. 解决的问题 原型模式(Prototype Pattern)是一种创建型设计模式,用于解决对象创建的问题,特别是在需要创建多个相似对象时,避免使用重复的构造代码。原型模式…

golang 熔断限流降级

限流 - 2k 但是我的服务能力只有1k,所以这个时候多出来的流量怎么办: 1. 拒绝 2. 排队等待。用户体验不太好: 当前访问用户过多,请稍后重试和你的服务直接挂了 用户体验降级了 - 原本是访问流畅,下单流畅 -> 当前访…

PHP7内核剖析 学习笔记 第四章 内存管理(2)

4.4 线程安全 单线程环境中,我们经常使用全局变量实现多个函数间共享数据,声明在函数之外的变量为全局变量,全局变量为各线程共享,不同的线程引用同一地址空间,如果一个线程修改了全局变量就会影响所有线程。线程安全…

filament的材质系统

filament是Google开源的一个跨平台实时pbr渲染引擎。注意,这是一个渲染引擎,不是一个完整的游戏引擎。 filament的材质系统文档:Filament Materials Guide,pbr算法文档:Physically Based Rendering in Filament。这些文…

【漏洞复现】CVE-2015-5531 Arbitrary File Reading

漏洞信息 NVD - CVE-2015-5531 Directory traversal vulnerability in Elasticsearch before 1.6.1 allows remote attackers to read arbitrary files via unspecified vectors related to snapshot API calls. 背景介绍 Elasticsearch is an open source distributed, RE…

在 Linux 中如何使用粘滞位 (t-bit)共享文件

在 Linux 系统中,共享文件是日常管理和协作中的常见任务,而粘滞位(Sticky Bit 或 t-bit)是实现共享目录安全性的重要工具之一。本文将带您详细了解如何在 Linux 中共享文件并配置粘滞位来保护共享资源的安全。 文件共享的常见场景…

开发场景中Java 集合的最佳选择

在 Java 开发中,集合类是处理数据的核心工具。合理选择集合,不仅可以提高代码效率,还能让代码更简洁。本篇文章将重点探讨 List、Set 和 Map 的适用场景及优缺点,帮助你在实际开发中找到最佳解决方案。 一、List:有序存…