给你一个链表的头节点 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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。