重温算法之环形链表 II

简介: 有时候一些题目如果借助额外的空间,比如hash这种会事半功倍,但是其实这种算是一种'投机取巧'的做法,在现有的前提是实现算法,解题的最佳方法应该是不借助额外的空间,即减小其时间复杂度。

微信截图_20220531173728.png

一.题目介绍


1.题目来源


链接:LeetCode


2.题目


给定一个链表的头节点head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数pos来表示链表尾连接到链表中的位置(索引从 0 开始。如果pos是-1,则在该链表中没有环。 注意:pos不作为参数进行传递,仅仅是为了标识链表的实际情况。不允许修改链表。 (官方的示例1图居挂了)微信截图_20220531181816.png


二.具体实现


1.实现思路


之前也遇到个是否有环的问题,而且是否有环的判断还是对数组中的元素进行遍历以后,对了元素依次比较然后判断其是否头尾相接即存在环,反正则不存在,这题借助hashset的特点就很容易实现,如果题目提到不需要额外的空间则hashset就不能使用了,那接下来看看具体的实现。


2.实现代码


1)自己的实现方式

public ListNode detectCycle(ListNode head) {
       //借助hashset
        HashSet<ListNode> set = new HashSet<>();
        while (head != null) {
        //将元素添加到hashset中
            set.add(head);
            head = head.next;
            //如果添加时发现元素已存在,即首尾相接,找到了环反正则没有找到,没有存在环
            if (set.contains(head)) {
                return head;
            }
        }
        return null;
    }
复制代码


2)题友的实现方式


使用快慢指针判断是否为环形,并且将快指针重新指向头,下一次和慢指针相交就是环形开始处。微信截图_20220531181951.png


3.运行结果

微信截图_20220531182036.png


三.题后思考


有时候一些题目如果借助额外的空间,比如hash这种会事半功倍,但是其实这种算是一种'投机取巧'的做法,在现有的前提是实现算法,解题的最佳方法应该是不借助额外的空间,即减小其时间复杂度。

目录
相关文章
|
2月前
|
算法
【算法】合并两个有序链表(easy)——递归算法
【算法】合并两个有序链表(easy)——递归算法
【算法】合并两个有序链表(easy)——递归算法
|
3月前
【数据结构OJ题】环形链表
力扣题目——环形链表
33 3
【数据结构OJ题】环形链表
|
3月前
【数据结构OJ题】环形链表II
力扣题目——环形链表II
22 1
【数据结构OJ题】环形链表II
|
2月前
|
存储 算法
【初阶数据结构篇】顺序表和链表算法题
此题可以先找到中间节点,然后把后半部分逆置,最近前后两部分一一比对,如果节点的值全部相同,则即为回文。
|
2月前
|
算法
【数据结构与算法】共享双向链表
【数据结构与算法】共享双向链表
13 0
|
2月前
|
算法
【数据结构与算法】双向链表
【数据结构与算法】双向链表
13 0
|
2月前
|
算法
【数据结构与算法】循环链表
【数据结构与算法】循环链表
15 0
|
2月前
|
存储 算法
【数据结构与算法】链表
【数据结构与算法】链表
18 0
|
2月前
|
算法
【C算法】链表算法
【C算法】链表算法
|
2月前
|
算法 Java
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
45 0
下一篇
无影云桌面