当前位置: 首页 > news >正文

leetcode 142.环形链表II

思路:双指针+哈希表

双指针这里的类型是快慢指针,前面也说过,常用于查找链表的中点或者判断有无环的应用。

首先用快慢指针一个走一个结点,一个走两个结点,判断这个链表有无环?如果没有,直接返回null;如果有,那么进行下面的操作:

我们设置哈希表用来存放结点和结点的个数键值对。然后用一个指针遍历链表。当出现一个结点出现两次的时候,那么此结点就是环的入口结点。

注意:只要不把哈希表的两个参数设为<Integer,Integer>,而是把哈希表两个参数设为<ListNode,Integer>就行,因为如果你那每一个结点的元素值作为Key,那么这个时候当你判断环的入口时就会出现明明不是出口,但是落在一个值相同的节点上。

其实设成<Integer,Integer>也是可以的,但是我们需要首先判断出来链表的长度,在进行判断环的入口的时候需要额外判断是否遍历了比链表长度还长的路程,这样才能判断出来。但问题是,这里并不能用方法来判断有环链表的长度,只能判断无环链表的长度,所以这种想法也只是一种参考。

/*** 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)return null;Map<ListNode,Integer>map=new HashMap<ListNode,Integer>();ListNode slow=new ListNode(-1);slow.next=head;ListNode fast=head;boolean flag=false;while(fast!=null&&fast.next!=null){slow=slow.next;fast=fast.next.next;if(fast==slow){flag=true;break;}}if(flag==false){return null;}else{ListNode tmp=head;while(tmp!=null){map.put(tmp,map.getOrDefault(tmp,0)+1);if(map.get(tmp)>=2){return tmp;}tmp=tmp.next;}return null;}}
}


http://www.mrgr.cn/news/14134.html

相关文章:

  • 新手怎么学唱歌?
  • Linux | 文件系统进阶:Inode与软硬链接艺术剖析
  • 联想小新 Pro 16:AI启航版,定义笔记本性能新高度
  • C#入门篇5
  • 【QT】学习笔记:导出资源中静态文件
  • 测试面试题,自动化测试与性能测试篇(附答案)
  • 基于STM32开发的智能照明控制系统
  • JavaWeb基础 -- SpringMVC请求和响应
  • 单线程Redis:Redis为什么这么快
  • 网络自动化:利用Python和Ansible实现网络配置管理
  • 超详细超实用!!!java开发之IntelliJ IDEA下载与安装破解以及汉化教程(三)
  • Linux操作系统su命令详解,附代码
  • 大模型企业应用落地系列四》基于大模型的对话式推荐系统》大模型底座层
  • DNS部署与安全
  • 西门子PLC控制激光读头,profient转Ethernet IP网关应用
  • SQLite Insert 语句
  • Effective Java 学习笔记--36-38条 枚举类型
  • C++设计模式2:代理模式
  • HashMap动态扩容解析
  • 在vue3中封装WebSocket