IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 环形链表 II 快慢指针法 + 哈希表法 -> 正文阅读

[数据结构与算法]环形链表 II 快慢指针法 + 哈希表法

环形链表 II 快慢指针法 + 哈希表法

链接:https://leetcode-cn.com/problems/linked-list-cycle-ii/

1. 题目要求

给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。

为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。

说明:不允许修改给定的链表。

示例1:

img

输入:head = [3,2,0,-4], pos = 1
输出:返回索引为 1 的链表节点
解释:链表中有一个环,其尾部连接到第二个节点。

示例2:

img

输入:head = [1,2], pos = 0
输出:返回索引为 0 的链表节点
解释:链表中有一个环,其尾部连接到第一个节点。

示例 3:

img

输入:head = [1], pos = -1
输出:返回 null
解释:链表中没有环。

2.快慢指针法:

image-20210723162707392

算法分析:

1.定义两个指针 fast 和 slow 同时指向 head ,fast 每次走2步,slow 每次走一步。

2.第一次相遇时,假设开头到环的节点个数为 a, 环走一圈的节点个数为 b。

  • fast走到链表的末端,fast == NULL,说明链表无环。

  • 假设 fast 指针走了 f 步,slow 指针走了 s 步。由第一步知:

f = 2 s f=2s f=2s

若 fast 和 slow 第一次相遇,则:fast比slow多走 n 个环。如上图所示:

f = s + n b f = s + nb f=s+nb
2(2)-(1): f = 2 n b f = 2nb f=2nb

(1) - (2) : s = n b s = nb s=nb

即第一次相遇时, fast 和 slow 分别走了 2n 和 n 个周长。

3.目前情况分析:

如上图所示,假如在 环里 6 这个节点相遇:

假如让指针一直走,并统计步数 k ,开始指针指向head节点,则走到环形节点入口时, k = a + n b k = a + nb k=a+nb, 相当于,走了a步,或者对于环形 b 又多绕了 n 圈。

现在slow已经走了 nb 圈,此时只需要 把fast 节点重新指向 head 节点,然后fast每次走一步,当 slow 走了 n b + a nb+a nb+a 步时,fast 走了 a a a 圈,此时 fast 和 slow 刚好在环形入口处,返回此时的地址即可。

3.C语言实现代码如下:

struct ListNode *detectCycle(struct ListNode *head) {
    // 1.定义fast、slow指针同时指向head,fast每次走2步,slow每次走1步;
    struct ListNode *fast = head;
    struct ListNode *slow = head;
    //2.如果fast走过链表末端,说明链表无环。
    while(1){
        if(fast == NULL || fast->next == NULL)
            return NULL;
        fast = fast->next->next;	//fast 每次走2步
        slow = slow->next;		   //slow 每次走1步
        if(fast == slow)
            break;
    }
    // 3.双指针第二次相遇
    fast = head;
    while(fast != slow){
        fast = fast->next;
        slow = slow->next;
    }
    return fast;
}

4. 哈希表法(hash table)

算法思路:

遍历环形链表,每次遍历的元素都使用 hash table 记录下来,比较该元素是否在 Hash Table 中,如果在,则返回索引(此时就找到了环形表的开头元素),否则把该元素添加到集合中,然后进行遍历。

class Solution:
    def detectCycle(self, head: ListNode) -> ListNode:
        temp = head;
        mySet = set()		# 定义集合用来存储
        while temp is not None:
            if temp in mySet:	# 判断一个元素是否在集合中 , 使用 in 即可。
                return temp
            else:
                mySet.add(temp)
            temp = temp.next
        return None
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-07-25 00:01:44  更:2021-07-25 00:02:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 16:30:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码