[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
以上。