141. Linked List Cycle
Given a linked list, determine if it has a cycle in it.
To represent a cycle in the given linked list, we use an integer pos
which represents the position (0-indexed) in the linked list where tail connects to. If pos
is -1
, then there is no cycle in the linked list.
Example 1:
Input: head = [3,2,0,-4], pos = 1
Output: true
Explanation: There is a cycle in the linked list, where tail connects to the second node.
Example 2:
Input: head = [1,2], pos = 0
Output: true
Explanation: There is a cycle in the linked list, where tail connects to the first node.
Example 3:
Input: head = [1], pos = -1
Output: false
Explanation: There is no cycle in the linked list.
Follow up:
Can you solve it using O(1) (i.e. constant) memory?
解题思路:
利用快慢指针fast,low,快指针fast步长为2遍历链表,慢指针low步长为1遍历链表。如果链表有环,快慢指针一定会相遇。如果无环,快指针遍历到NULL。
/*
执行用时 : 12 ms, 在Linked List Cycle的C提交中击败了96.76% 的用户
内存消耗 : 8.5 MB, 在Linked List Cycle的C提交中击败了13.28% 的用户
*/
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
bool hasCycle(struct ListNode *head) {
struct ListNode* fast=head,*low=head;
//if(head==NULL||head->next==NULL)return false;
while(fast!=NULL&&fast->next!=NULL){
fast=fast->next->next;
low=low->next;
if(fast==low)return true;
}
return false;
}
后记:
- 注意循环条件(fast != NULL && fast->next != NULL)的设定,fast != NULL已经包含了low指针不为NULL
- 如果fast->next == NULL时,访问fast->next->next会报错。
LeetCode 142. Linked List Cycle II(环形链表II) -- c语言