首页 > 其他分享 >力扣142.环形链表II

力扣142.环形链表II

时间:2024-10-17 22:49:43浏览次数:9  
标签:力扣 head ListNode next 链表 142 null 节点

题目链接:142. 环形链表 II - 力扣(LeetCode)

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

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。

不允许修改 链表。

示例 1:

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

示例 2:

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

示例 3:

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

提示:

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

解法一:哈希集合

思路:

遍历链表,有两种情况:

1.该节点不在哈希集合中 -> 将该节点存入哈希集合

2.该节点在哈希集合中 -> 说明此处成环 -> 返回该节点

代码:

/**
 * 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) {
        HashSet<ListNode> m=new HashSet<ListNode>();
        ListNode curr=head;
        while(curr!=null){
            if(m.contains(curr)){
                return curr;
            }else{
                m.add(curr);
            }
            curr=curr.next;
        }
        return null;
    }
}

复杂度分析:

时间复杂度:O(n)        n为链表节点个数

空间复杂度:O(n)        链表中的每个节点都保存在哈希集合当中。

进阶:你是否可以使用 O(1) 空间解决此题?

解法二:双指针

思路:

要解决两个问题:

1.判断链表是否有环

        使用快慢指针,快指针每次走两步,慢指针每次走一步,如果快慢指针相遇,说明有环

2.如果有环,怎么找到环的入口

        快慢指针相遇节点和链表头结点指针同步前进,相遇点为环的入口

代码:

/**
 * 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 f=head;//快指针
        ListNode l=head;//慢指针
        ListNode h=head;
        boolean flag=false;

        if(head==null || head.next==null){
            return null;
        }

        //判断是否成环
        while(f.next!=null && f.next.next!=null){
            f=f.next.next;
            l=l.next;
            if(f==l){
                flag=true;//快慢指针相交,说明成环
                break;
            }
        }

        if(flag==false){
            return null;
        }else{
            //寻找环的起点
            //相遇节点指针和头结点指针同步遍历
            while(h!=f){
                h=h.next;
                f=f.next;
            }
            return h;
        }
    }
}

复杂度分析:

时间复杂度:O(n)        

空间复杂度:O(1)   

标签:力扣,head,ListNode,next,链表,142,null,节点
From: https://blog.csdn.net/m0_74931837/article/details/142898811

相关文章

  • 力扣242.有效的字母异位词
    题目链接:242.有效的字母异位词-力扣(LeetCode)给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的 字母异位词。示例 1:输入:s="anagram",t="nagaram"输出:true示例2:输入:s="rat",t="car"输出:false提示:1<=s.length,t.length<=......
  • 力扣349.两个数组的交集
    题目链接:349.两个数组的交集-力扣(LeetCode)给定两个数组 nums1 和 nums2 ,返回 它们的 交集。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。示例1:输入:nums1=[1,2,2,1],nums2=[2,2]输出:[2]示例2:输入:nums1=[4,9,5],nums2=[......
  • 【状态机DP】力扣309. 买卖股票的最佳时机含冷冻期
    给定一个整数数组prices,其中第prices[i]表示第i天的股票价格。​设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):卖出股票后,你无法在第二天买入股票(即冷冻期为1天)。注意:你不能同时参与多笔交易(你必须在再次购......
  • 【状态机DP】【hard】力扣188. 买卖股票的最佳时机 IV
    给你一个整数数组prices和一个整数k,其中prices[i]是某支给定的股票在第i天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成k笔交易。也就是说,你最多可以买k次,卖k次。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。示例......
  • 【数据结构】之链表详解
    链表是一种常用的数据结构,它是一种线性数据结构,但与数组不同,它并非连续存储数据,而是通过指针将数据节点连接起来。每个节点都包含数据域和指向下一个节点的指针域。这种结构赋予链表独特的优势和局限性,使其在某些场景下优于数组,在另一些场景下则相对逊色。本文将深入探讨链表,包......
  • [1426]基于JAVA的微信公众号运营智慧管理系统的设计与实现
    毕业设计(论文)开题报告表姓名学院专业班级题目基于JAVA的微信公众号运营智慧管理系统的设计与实现指导老师(一)选题的背景和意义选题背景与意义:在当前信息化、数字化的社会环境下,微信公众号已经成为企事业单位、商家和个体进行品牌推广、客户服务、产品营销以及用户管理......
  • 翻转链表常用写法
    翻转链表常用写法循环写法classSolution{public:ListNode*reverseList(ListNode*head){ListNode*prev=nullptr,*next=nullptr,*now=head;while(now){next=now->next;now->next=prev;prev=......
  • 24. 两两交换链表中的节点
    给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。示例1:输入:head=[1,2,3,4]输出:[2,1,4,3]示例2:输入:head=[]输出:[]示例3:输入:head=[1]输出:[1]解题思路:1.递归方法实现节点对的交换......
  • 力扣刷题_SQL50题
    高频SQL50题(基础版)-学习计划-力扣(LeetCode)全球极客挚爱的技术成长平台602.好友申请II:谁有最多的好友题目:编写解决方案,找出拥有最多的好友的人和他拥有的好友数目。生成的测试用例保证拥有最多好友数目的只有1个人。CreatetableIfNotExistsRequestAccepte......
  • 力扣面试_SQL50题
    高频SQL50题(基础版)-学习计划-力扣(LeetCode)全球极客挚爱的技术成长平台585.2016年的投资CreateTableIfNotExistsInsurance(pidint,tiv_2015float,tiv_2016float,latfloat,lonfloat);TruncatetableInsurance;insertintoInsurance(pid,tiv_2015,......