NC4. 环形链表(easy)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210628214532591.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Rpbmd6aGk0NDY5,size_16,color_FFFFFF,t_70)
方法一:快慢指针(最优解)
思路:定义fast、slow即快慢双指针,移动步数分别为2和1,如果链表存在环,那它们必然会相遇。当快指针fast到达尾部时,表示并不存在环路。
/**
* 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, fast = head.next;
while (fast != slow) {
if (fast == null || fast.next == null) {
return false;
}
fast = fast.next.next;
slow = slow.next;
}
return true;
}
}
时间复杂度: O(N), 因为需要遍历一遍链表。
空间复杂度: O(1), 仅需要两个指针所对应的额外存储空间。
总结:本题考频极高,快慢指针在链表问题上的应用十分广泛,还需要加大训练强度!