[LeetCode]141. Linked List Cycle

                                            [LeetCode]141. Linked List Cycle

                                                                                          2018-8-12

1.题目描述

Given a linked list, determine if it has a cycle in it.

Follow up:
Can you solve it without using extra space?

翻译:给定一个链表,判断其是否包含环,并且要求使用O(1)的空间复杂度。

 

2. 解题思路

这是LeetCode中最为基础的双指针问题,即设置两个指针:pf,ps,其中pf为快指针,ps为慢指针。快指针每次向前移动两步,而慢指针每次向前移动一步。

1)如果链表不包含环,则一定快指针率先到达链表尾部,快指针和慢指针指向的节点地址一定不相同,时间复杂度正比于链表长度为O(n)。

2)如果链表包含环,快指针和慢指针总会在某一时刻相遇,指向同一节点。

由于快指针比慢指针先到达环,所以总会在小于环的节点数的时间里,出现下面两种情况:

(1)快指针落后慢指针2个节点,如下图(1)所示,但经过一步迭代,就会出现第(2)种情况;

(2)快指针落后慢指针1个节点,如下图(2)所示。

所以最终都能出现快指针落后慢指针1个节点的情况,在经过一步,如图(2)到图(3),就会出现快指针和慢指针指向一个节点的情况。

所以只要快指针和慢指针在一个节点上相遇,就等价于该链表存在环。

算法总消耗的时间不超过N+K,N为非环形部分的节点数,K为环形部分节点数,所以时间复杂度为O(n)。

 

3. 代码实现

下面是已跑通的python代码。

# 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
        """
        pfast,pslow=head,head
        while(pfast!=None and pfast.next!=None):
            pslow=pslow.next
            pfast=pfast.next.next
            if pslow==pfast:
                return True
        return False

以上。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值