《LeetCode之每日一题》:284.环形链表
Posted 是七喜呀!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《LeetCode之每日一题》:284.环形链表相关的知识,希望对你有一定的参考价值。
环形链表
题目链接: 环形链表
有关题目
给你一个链表的头节点 head ,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。
为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。
注意:pos 不作为参数进行传递 。
仅仅是为了标识链表的实际情况。
如果链表中存在环 ,则返回 true 。 否则,返回 false 。
提示:
链表中节点的数目范围是 [0, 10^4]
-10^5 <= Node.val <= 10^5
pos 为 -1 或者链表中的一个 有效索引 。
进阶:你能用 O(1)(即,常量)内存解决此问题吗?
题解
法一:哈希表存储节点
/**
* Definition for singly-linked list.
* struct ListNode
* int val;
* struct ListNode *next;
* ;
*/
struct hashTable
struct ListNode *key;
UT_hash_handle hh;
;
struct hashTable *hashtable;
struct hashTable *find(struct ListNode *node)
struct hashTable *temp;
HASH_FIND_PTR(hashtable, &node, temp);
return temp;
void insert(struct ListNode *node)
struct hashTable *temp = (struct hashTable*)malloc(sizeof(struct hashTable));
temp->key = node;
HASH_ADD_PTR(hashtable, key, temp);
bool hasCycle(struct ListNode *head)
hashtable = NULL;
while(head != NULL)
if (find(head) != NULL)
return true;
insert(head);
head = head->next;
return false;
法二:快慢指针
参考官方题解
/**
* Definition for singly-linked list.
* struct ListNode
* int val;
* struct ListNode *next;
* ;
*/
bool hasCycle(struct ListNode *head)
if (NULL == head || head->next == NULL)
return false;
struct 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;
以上是关于《LeetCode之每日一题》:284.环形链表的主要内容,如果未能解决你的问题,请参考以下文章