NC4. 环形链表(easy)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/7f15e10f3ccd5056feade537f3fcc584.png)
方法一:快慢指针(最优解)
思路:定义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), 仅需要两个指针所对应的额外存储空间。
总结:本题考频极高,快慢指针在链表问题上的应用十分广泛,还需要加大训练强度!