码迷,mamicode.com
首页 > 编程语言 > 详细

Python3解leetcode Linked List Cycle

时间:2019-06-25 09:27:44      阅读:107      评论:0      收藏:0      [点我收藏+]

标签:没有   inf   列表   pytho   node   lin   还需   bool   最大值   

问题描述:

 

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

 

Python3解leetcode Linked List Cycle

标签:没有   inf   列表   pytho   node   lin   还需   bool   最大值   

原文地址:https://www.cnblogs.com/xiaohua92/p/11080739.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!