牛客-NC4
141. 环形链表(easy)
方法一:快慢指针(最优解)
思路:定义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), 仅需要两个指针所对应的额外存储空间。
总结:本题考频极高,快慢指针在链表问题上的应用十分广泛,还需要加大训练强度!