leetcode第141题链表有无环
程序员文章站
2022-06-20 10:42:45
...
题目
给定一个链表,判断链表中是否有环。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
示例 1:
输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。
示例 2:
输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。
示例 3:
输入:head = [1], pos = -1
输出:false
解释:链表中没有环。
分析
链表有环就是说链表中后面的节点的next指向了他前面的节点,这就使得链表形成一个闭环。
解决
1.hash法
遍历链表将链表的节点存放在hash表里,当存放某一个节点时,发现该节点已经存在,则证明链表有环,如果链表遍历结束都不存在存入hash失败,则链表无环。
代码实现
/**
* 判断链表是否有环 注册表法
* @param head
* @return
*/
public boolean hasCycle(ListNode head) {
Set<ListNode> set = new HashSet<>();
ListNode currNode = head;
while (currNode != null){
if(!set.add(currNode)){
return true;
}
currNode = currNode.next;
}
return false;
}
时间复杂度:O(n)
空间复杂度:O(n)
2.快慢指针法
快慢指针法有点类似于跑步的感觉,而链表就是跑道,请你慢慢体会。
假如这个跑道是直的,两个速度不同的运动员从同一位置出发,他们将永远不会相遇。
但是假设这个跑道是有一个圈,那么总有一个时刻跑的快的会追上慢的。
代码实现
/**
* 判断链表是否有环 双指针 快慢指针
* @param head
* @return
*/
public boolean hasCycle(ListNode head) {
if(head == null || head.next == null){
return false;
}
ListNode slow = head.next;
ListNode fast = head.next.next;
while (slow != fast){
if (fast == null || fast.next == null){
return false;
}
slow = slow.next;
fast = fast.next.next;
}
return true;
}
时间复杂度:O(n)
空间复杂度:O(1)
关注公众号 精彩不错过
上一篇: Hibernate 遇到的坑
下一篇: 第十二周作业
推荐阅读
-
#leetcode刷题之路19-删除链表的倒数第N个节点
-
LeetCode第147题对链表进行插入排序
-
leetcode第141题链表有无环
-
LeetCode每日一题 (36) 141. 环形链表(找循环:快慢指针)
-
LeetCode141 链表是否存在环
-
#leetcode刷题之路19-删除链表的倒数第N个节点
-
【小白爬Leetcode141】1.4环形链表 Linked List Cycle
-
C++ 笔试每日一题(leetcode 之删除链表的倒数第 n 个节点)
-
【Python刷题Leetcode】链表(反转、找交点、快慢指针找环、分割列表、深拷贝、合并链表)
-
LeetCode第147题对链表进行插入排序