142.环形链表II
给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
【题目】
给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。
不允许修改 链表。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/linked-list-cycle-ii
分析:
主要考察两知识点:
判断链表是否环
如果有环,如何找到这个环的入口
【解答】
1、快慢指针 - 常规方法
时间复杂度:O(n)
空间复杂度:O(1)
分两个步骤进行
①利用快慢指针判断链表是否存在环
这个道理就是一个人一步步跑,另一个人两步两步跑,最后第二个人超越了第一个人一圈,让然后相遇了。如果说不存在环的话,那么快指针会先跑到终点,指向nullptr
②利用双指针判断环的入口-这里涉及到数学推导
最终x = z ;x是我们想要去求解的量,在fast指针和slow指针相遇后,让fast指针一步步走。让slow从头节点开始一步步走,重合的时候就是结点所在的位置。
1 | /** |
2、map/unordered_map - 常规方法
最基本的想法,创建一个键值表,如果出现了曾经出现过的节点就可以返回了。
时间复杂度:底层基于红黑树的map
,在查找某个元素的时候,采用二分查找的办法,时间为O(lgn)
;链表n个节点,时间复杂度O(nlgn)
. 反之,如果是无序的unordered_map,元素没有排序,所以时间复杂度为O(n)
空间复杂度:创建了一个哈希表 O(n);
利用map 进行实现:
1 | /** |
3、野路子-非常规方法
时间复杂度O(n)
空间复杂度O(1)
链表是在堆上申请的空间,从低向高,如果是按顺序进行链表节点内存的申请,那么我们在环的那一点,一定存在 head → next 小于head;利用这个规律,复杂度为O(n),可以比较快速的解决问题。
1 | /** |