Leetcode刷题(4)简单单链表:判断链表是否有环

题目

Leetcode 141. 环形链表

Leetcode刷题(4)简单单链表:判断链表是否有环_第1张图片Leetcode刷题(4)简单单链表:判断链表是否有环_第2张图片
Leetcode刷题(4)简单单链表:判断链表是否有环_第3张图片

难度: 简单

题目分析: 两种解法

一种是使用快慢指针的方法,快指针移动速度是慢指针的两倍,这样,如果链表有环,快指针一定会从后赶上慢指针。

这种解法空间复杂度是O(1), 时间复杂度是 O(n)。

一种是借助python内置集合类型 set() 进行节点存储,发现了两个一模一样的节点,就能说明链表有环,同时,第一个重复的节点,也是这个环的入口。

这种解法空间复杂度是O(n), 时间复杂度是 O(n)

解法一: 额外存储空间

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def hasCycle(self, head: ListNode) -> bool:
    	if head is None:
    		return False
    	
    	visited = set()
    	p = head
    	while p is not None:
    		if p in visited:
    			return True
    		else:
    			visited.add(p)
    			p = p.next
    	return False

运行结果

Leetcode刷题(4)简单单链表:判断链表是否有环_第4张图片
提醒:不要太在意leetcode的评分显示的运行速度。下面两次提交是同个代码,差别时间接近一倍。
Leetcode刷题(4)简单单链表:判断链表是否有环_第5张图片
建议大家点开详情,看速度最快的代码,如果跟我们自己代码一样,那说明我们的代码目前是比较好的,不会饶。

解法二: 使用快慢指针

if head is None:
            return False

        fast = head
        slow = head
        while fast is not None and fast.next is not None:
            slow = slow.next
            fast = fast.next.next
            if slow == fast:
                return True
        
        return False

运行结果:

Leetcode刷题(4)简单单链表:判断链表是否有环_第6张图片
Leetcode刷题(4)简单单链表:判断链表是否有环_第7张图片
三次是同个代码,差异极大。

关键点:

  1. 使用快慢指针,快指针每次只比慢指针多走一步,这样能确保它们之间的距离,每次缩减一格(有环的情况),如果快指针一次多走两步,假如它们之间的距离是奇数步,那么永远重合不了

你可能感兴趣的:(刷题,学习札记)