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 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 剑指Offer 23. 链表中环的入口节点 -> 正文阅读

[数据结构与算法]剑指Offer 23. 链表中环的入口节点

题目描述:
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,返回null。
输入说明:输入分为2段,第一段是入环前的链表部分,第二段是链表环的部分,后台将这2个会组装成一个有环或者无环单链表。
示例1:

输入:{1,2},{3,4,5}
返回值:3
说明:返回环形链表入口节点,我们后台会打印该环形链表入口节点,即3   

示例2:

输入:{1},{}
返回值:"null"
说明:没有环,返回null,后台打印"null" 

示例3:

输入:{},{2}
返回值:2
说明:只有环形链表节点2,返回节点2,后台打印2   

方法一:
分析:1.判断是否有环,如果没有环,返回null,如果有环,则快慢指针一定会相遇,且在环中相遇,记录在环中相遇的节点。2.从该相遇节点开始,一边移动,一边计数,当下一次到达该节点时,就可以求得环中的节点数x。3.最后将快慢指针同时置于开始节点,快指针先走x步,接着快慢指针同时一步一步移动,下一次相遇时,就是环的入口节点。

public class Solution {
    public ListNode EntryNodeOfLoop(ListNode pHead) {
        // 判断是否存在环
        ListNode node = MeetingNode(pHead);
        if (node == null) {
            return node; // 没有环
        }
        
        // 有环,则node就是快慢指针在环中相遇的节点
        int count = 1;
        ListNode nextNode = node.next;
        while (node != nextNode) {
            nextNode = nextNode.next;
            count++;
        }
        // 循环结束后,count的值就是环的长度
        
        ListNode fast = pHead;
        ListNode slow = pHead;
        // fast先走count步
        int i = 0;
        while (i < count) {
            fast = fast.next;
            i++;
        }
        // 然后二者再同时向后一次移动一步,再次相遇的节点就是入环节
        while (fast != slow) {
            fast = fast.next;
            slow = slow.next;
        }
        return fast; // 返回slow也可以,此时fast和slow指向同一个节点
        
    }
    
    // 判断是否有环,如果无环,返回null,如果有环,返回在环中相遇的节点
    public ListNode MeetingNode(ListNode pHead) {
        // 如果没有环,返回null
        if (pHead == null || pHead.next == null) {
            return null;
        }
        ListNode fast = pHead; // 快指针,一次走两步
        ListNode slow = pHead; // 慢指针,一次走一步
        do {
            fast = fast.next.next;
            slow = slow.next;
        } while(fast != slow && fast != null && fast.next != null);
        if (fast == null || fast.next == null) {
            return null; // 没有环
        }
        return fast; // 返回slow也可以,此时二者指向同一个节点
    }
}

时间复杂度: O ( n ) O(n) O(n),空间复杂度: O ( 1 ) O(1) O(1)


结束语:如果本篇博客对您有帮助,请点赞、收藏或关注,您的鼓励是博主进步的动力,感谢支持,共同进步。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-07-04 20:01:20  更:2021-07-04 20:01:35 
 
开发: 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:44:44-

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