版权声明:All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally. 本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/murasakino/article/details/90020728
141. Linked List Cycle
https://leetcode.com/problems/linked-list-cycle/
Description
Given a linked list, determine if it has a cycle in it.
Solutions
https://leetcode.com/problems/linked-list-cycle/solution/
Approach 1 两个指针
与操场跑步类似,如果没有环形,那么跑的快的最后会到达终点(单跑道),有环形的话,跑的快的最终会追上慢的。
设置两个指针p1和p2,每次p1向前走一步,p2向前走两步,直到p2碰到NULL或者两个指针相等时结束循环。
如果两个指针相等,说明该链表存在环。
Approach 2 : hash table
把节点存放的地址读取出来,存放进哈希表中,指针后移直到指针指向NULL或者发现哈希表中有地址重复的地方停止,如果发现重复地址,则该指针即为环的出口地址。
Submissions
/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public boolean hasCycle(ListNode head) {
if(head==null||head.next==null)
return false;
ListNode slow=head;
ListNode fast=head.next;
while(slow!=fast)//当fast追上next的时候就是环
{
if(fast==null||fast.next==null)
return false;
slow=slow.next;//为什么差了两个,是因为fast跑得快,一次跑两步,所以只需判断fast和fast.next为不为空
fast=fast.next.next;
}
return true;
}
}
public boolean hasCycle(ListNode head) {
Set<ListNode> nodesSeen = new HashSet<>();
while (head != null) {
if (nodesSeen.contains(head)) {
return true;
} else {
nodesSeen.add(head);
}
head = head.next;
}
return false;
}