《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.环形链表的主要内容,如果未能解决你的问题,请参考以下文章

每日一题 为了工作 2020 0405 第三十四题

Java算法 每日一题 编号142:环形链表 II

Java算法 每日一题 编号142:环形链表 II

Java算法 每日一题 编号142:环形链表 II

《LeetCode之每日一题》:286.移除链表元素

《LeetCode之每日一题》:287.反转链表