zoukankan      html  css  js  c++  java
  • Python3解leetcode 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 poswhich 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.
    

    思路1:

    设置两个指针,一个每次走一步,一个每次走两步,那么如果有环,两个指针一定会相遇。

    但这个代码写出来仅仅beats 28.6%,效率不高

    代码1:

    # Definition for singly-linked list.
    # class ListNode(object):
    #     def __init__(self, x):
    #         self.val = x
    #         self.next = None
    
    class Solution(object):
        def hasCycle(self, head):
            """
            :type head: ListNode
            :rtype: bool
            """
            if head == None or head.next == None: return False
            head2 = head
            while head2.next != None and head.next != None:#当两个指针的next都不为None
                if (head2.next.next != None):#如果走两步的指针head2的next.next不为None
                    head2 = head2.next.next
                else:
                    return False
                head = head.next
                if(head == head2):
                    return True
            return False

    将上述思路优化后,代码如下:

    if not head  or not head.next: return False
            head2 = head
            while not head2 and not head2.next:#只需要关注走的比较快的指针是否为空即可,若较快指针不为空,则较慢指针肯定不为空
                head2 = head2.next.next 
                head = head.next
                if(head == head2):
                    return True
            return False  

    思路2:

    循环遍历整个列表,将遍历过的节点值设置为inf(最大值),如果后续遍历的节点值有等于inf的,则证明有环,否则就是没有环。

    该算法写出来beats65.7%的人,还需要优化

    代码2:

    # Definition for singly-linked list.
    # class ListNode(object):
    #     def __init__(self, x):
    #         self.val = x
    #         self.next = None
    
    class Solution(object):
        def hasCycle(self, head):
            """
            :type head: ListNode
            :rtype: bool
            """
            if head == None or head.next == None: return False
            head.val = float('inf')
            while head.next != None:#当指针的next都不为None
                if head.val == head.next.val:
                    return True
                else:
                    head = head.next
                    head.val = float('inf')
            return False
  • 相关阅读:
    最小生成树
    线段树
    编程快捷键
    线段树的动态开点
    常用库
    线性求逆元
    文件读入
    树上倍增(LCA)
    set容器
    快读与快写
  • 原文地址:https://www.cnblogs.com/xiaohua92/p/11080739.html
Copyright © 2011-2022 走看看