【力扣】环形链表

给你一个链表的头节点 head ,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。

如果链表中存在环 ,则返回 true 。 否则,返回 false 。

我的方法:哈希表存访问信息,如果二次访问某节点,则有环。时间复杂度O(n),空间复杂度O(n)。

class Solution {
public:
    bool hasCycle(ListNode* head) {
        unordered_map<ListNode*, int> hashtable;
        ListNode* p = head;
        while (p) {
            ++hashtable[p];
            if (hashtable[p] == 2) return 1;
            p = p->next;
        }
        return 0;
    }
};

题解方法:快慢指针法。当双指针重合时,说明有环。时间复杂度O(n),慢指针进入环后,由于快慢指针速度差为1,最坏情况,相对运动下需要绕一圈才能赶上,空间复杂度O(n)。

链表问题相对容易掌握。 不要忘记 “双指针解法” ,它不仅适用于数组问题,而且还适用于链表问题。 ——力扣

class Solution:
    def hasCycle(self, head: ListNode) -> bool:
        fast = slow = head
        while fast and fast.next:
            fast = fast.next.next
            slow = slow.next
            if fast == slow:
                return True
        return False
作者:meishaoming
链接:https://leetcode.cn/problems/merge-two-sorted-lists/solution/he-bing-liang-ge-you-xu-lian-biao-by-leetcode-solu/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的:(实战,链表,leetcode,数据结构)