首页 > 其他分享 >142.环形链表II——学习笔记

142.环形链表II——学习笔记

时间:2023-03-25 22:36:29浏览次数:51  
标签:II head ListNode next 链表 142 null 节点

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

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 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
解释:链表中没有环。

提示

  • 链表中节点的数目范围在范围 [0, 104] 内
  • -105 <= Node.val <= 105
  • pos 的值为 -1 或者链表中的一个有效索引

题目来源:力扣(LeetCode)链接

题解

  • 自己做的(利用了Map)
    /**
    * Definition for singly-linked list.
    * class ListNode {
    *     int val;
    *     ListNode next;
    *     ListNode(int x) {
    *         val = x;
    *         next = null;
    *     }
    * }
    */
    public class Solution {
        public ListNode detectCycle(ListNode head) {
            if (head == null) { //如果链表为空,就直接返回null
                return null;
            }
            //创建map集合用来存放链表中的节点
            Map<ListNode,ListNode> nodeMap = new HashMap<>();
            ListNode temp = head;
            while (temp.next != null) {
                //先判断map集合中是否有当前节点的下一节点
                //如果有,那么当前节点的下一节点即是环形链表的起始节点
                if (nodeMap.containsKey(temp.next)) {
                    return temp.next;
                }
                //先判断再把节点放入map中
                nodeMap.put(temp, temp.next);
                temp = temp.next;//节点后移
            }
            //while循环结束,说明没有找到
            return null;
        }
    }
    
  • 快慢指针法(具体分析见代码随想录)
    img
    /**
    * Definition for singly-linked list.
    * class ListNode {
    *     int val;
    *     ListNode next;
    *     ListNode(int x) {
    *         val = x;
    *         next = null;
    *     }
    * }
    */
    public class Solution {
        public ListNode detectCycle(ListNode head) {
            ListNode slow = head; //慢指针,每次走一步
            ListNode fast = head; //快指针,每次走二步
            //因为快指针每次走两步,所以需要判断fast和fast.next是否为空
            while (fast != null && fast.next != null) {
                slow = slow.next;//慢指针走一步
                fast = fast.next.next;//快指针走两步
                if (slow == fast) {//快慢指针相遇,说明有环
                    ListNode index1 = fast;//index1从相遇点开始出发
                    ListNode index2 = head;//index2从链表起始位置开始出发
                    //两者相遇时即为环形链表的起始位置
                    while (index1 != index2) {
                        index1 = index1.next;
                        index2 = index2.next;
                    }
                    //返回这个起始位置
                    return index1;
                }
            }
            //如果链表为空,或者没有环形链表,都会返回null
            return null;
        }
    }
    

标签:II,head,ListNode,next,链表,142,null,节点
From: https://www.cnblogs.com/benben-home/p/17255773.html

相关文章

  • 面试题 02.07. 链表相交——学习笔记
    题目:给你两个单链表的头节点headA和headB,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回null。图示两个链表在节点c1开始相交:题目数据保......
  • 19.删除链表的倒数第N个节点——学习笔记
    题目:给你一个链表,删除链表的倒数第n个结点,并且返回链表的头结点示例1:输入:head=[1,2,3,4,5],n=2输出:[1,2,3,5]示例2:输入:head=[1],n=1输出:[]示例3:......
  • LeetCode 59. 螺旋矩阵 II
    这道题可以采用模拟法来实现。我们可以设置上下左右四个边界,然后模拟螺旋填充元素。具体来说,我们定义left、right、top、bottom四个变量代表当前需要填充的最左边、最右......
  • #yyds干货盘点# LeetCode面试题:螺旋矩阵 II
    1.简述:给你一个正整数 n,生成一个包含1到 n2 所有元素,且元素按顺时针顺序螺旋排列的 nxn正方形矩阵matrix。 示例1:输入:n=3输出:[[1,2,3],[8,9,4],[7,6,5]]示......
  • 力扣---剑指 Offer 32 - III. 从上到下打印二叉树 III
    请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。例如:给定二叉树:......
  • 2023-03-25 单链表LinkList的基本操作
    1#include<stdio.h>2#include<stdbool.h>3#include<malloc.h>4typedefstructLNode5{6intdata;7structLNode*next;8}LNod......
  • Josephu问题与单向环形链表
    Josephu问题与单向环形链表1.什么是约瑟夫问题(Josephu)Josephu问题的设定为:假设编号为1,2,...,n的n个人围坐成一圈,从编号为k(1≤k≤n)的人开始报数,当报至m时报m的这个人出......
  • 链表的中间结点
     链表的中间结点 描述给定一个带有头结点head的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。  样例样例1:......
  • 块状链表
    块状链表基本概念块状链表本身是一个链表,但是链表储存的并不是一般的数据,而是由这些数据组成的顺序表。每一个块状链表的节点,也就是顺序表,可以被叫做一个块。块状链表是......
  • 代码随想录 day 25 216.组合总和III | 17.电话号码的字母组合
    找出所有相加之和为n的k个数的组合。组合中只允许含有1-9的正整数,并且每种组合中不存在重复的数字。说明:所有数字都是正整数。解集不能包含重复的组合。示例......