링크 : https://leetcode.com/problems/linked-list-cycle/
description
Given head, the head of a linked list, determine if the linked list has a cycle in it.
There is a cycle in a linked list if there is some node in the list that can be reached again by continuously following the next pointer. Internally, pos is used to denote the index of the node that tail’s next pointer is connected to. Note that pos is not passed as a parameter.
Return true if there is a cycle in the linked list. Otherwise, return false.
example
Example 1:
Input: head = [3,2,0,-4], pos = 1
Output: true
Explanation: There is a cycle in the linked list, where the tail connects to the 1st node (0-indexed).
Example 2:
Input: head = [1,2], pos = 0
Output: true
Explanation: There is a cycle in the linked list, where the tail connects to the 0th node.
Example 3:
Input: head = [1], pos = -1
Output: false
Explanation: There is no cycle in the linked list.
Constraints
- The number of the nodes in the list is in the range [0, 104].
- -105 <= Node.val <= 105
- pos is -1 or a valid index in the linked-list.
풀이
코드
# 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 not head : return False
node = head
visitied = set()
while node :
if node in visitied : return True
visitied.add(node)
node = node.next
return False
설명
쉬운 문제임에도 풀이를 쓰는 것은 새삼 자료형의 중요성을 깨달았기 때문..! 동일한 코드에서 visitied
가 배열일 때와 집합 자료형일 때 런타임 속도가 꽤 큰 차이가 난다.
리스트를 쓸 때는 860ms였는데 집합 자료형으로 변경하니 52ms로 10배 이상 줄어들었다. 앞으로도 잘 생각하며 자료형을 선택하자.