今天的题目是141. 环形链表
检查链表是否有环的方法以前听过 快慢指针的方法。
class Solution:
def hasCycle(self, head: ListNode) -> bool:
# 如果链表为空或只有一个元素,直接返回没有环
if not head or not head.next:return False
# 定义2个指针 一个从头开始,一个从下一个位置开始
slow,fast = head,head.next
# 快指针到尾部之前循环
while fast and fast.next:
# 如果快指针被满指针追上,则说明有环
if fast == slow:return True
# 满指针向后一步
slow = slow.next
# 快指针向后两步
fast = fast.next.next
# 循环结束,则不是没有环
return False
执行用时 :56 ms, 在所有 Python3 提交中击败了60.90%的用户
内存消耗 :16.6 MB, 在所有 Python3 提交中击败了13.61%的用户
看了一下别的解法,
class Solution:
def hasCycle(self, head: ListNode) -> bool:
if not head:
return head
# 设置一个列表用于存放已经走过的位置
m = []
# head不为空则循环
while head:
# 如果在列表中找到之前走过的位置就表示有环
if head in m:
return True
# 否则就把当前位置记录下来
m.append(head)
# 往后移动
head = head.next
# 循环完毕代表没环
return False
Your runtime beats 5.11 % of python3 submissions
Your memory usage beats 23.78 % of python3 submissions (16.3 MB)
执行结果有点诧异,速度超级慢1092ms,是快慢指针20倍,后来想想,如果一个环比较大,单指针绕弯一圈的时间,比双指针要慢一倍,所以要循环更多次才能发现重复,然后空间竟然比双指针小,我本来想多一个数组存放极端情况空间不是要O(n)吗,这道题要求空间O(1),感觉这个方式也不是很合适。