본문 바로가기

00/algorithm

Linked List Cycle 2 (in Python)

반응형

Problem


Given a linked list, return the node where the cycle begins. If there is no cycle, return null.

To represent a cycle in the given linked list, we use an integer pos which represents the position (0-indexed) in the linked list where tail connects to. If pos is -1, then there is no cycle in the linked list.

Note: Do not modify the linked list.

 

Example 1:

Input: head = [3,2,0,-4], pos = 1
Output: tail connects to node index 1
Explanation: There is a cycle in the linked list, where tail connects to the second node.

Example 2:

Input: head = [1,2], pos = 0
Output: tail connects to node index 0
Explanation: There is a cycle in the linked list, where tail connects to the first node.

Example 3:

Input: head = [1], pos = -1
Output: no cycle
Explanation: There is no cycle in the linked list.

 

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

Solution



Approach 1 : Using A Hash Table


Approach 2 : Floyd's Cycle Detection Algorithm


I strongly recommend that you refer link below.

https://www.youtube.com/watch?v=LUm2ABqAs1w


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None
 
class Solution(object):
    def Approach1(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        
        # Time complexity : O(N)
        # Space complexity : O(N)
        
        dic = {}
        
        while head :
            
            if head in dic :
                return head
            
            dic[head] = 1
            head = head.next
            
        return None
 
    def Approach2(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        
        # Time Complexity : O(N)
        # Space Complexity : O(1)
        
        slow = head
        fast = head
        
        while fast and fast.next :
            
            slow = slow.next
            fast = fast.next.next
            
            if slow == fast :
                
                slow = head
                
                while slow != fast :
                    slow = slow.next
                    fast = fast.next
                
                return slow
            
        return None
cs



Source

https://leetcode.com/problems/linked-list-cycle-ii/

반응형

'0 > algorithm' 카테고리의 다른 글

Contains Duplicate3 (in Python)  (0) 2019.02.02
KMP Algorithm  (0) 2019.01.31
Minimum Depth of Binary Tree (in Python)  (0) 2019.01.29
Sort linked list (in Python)  (0) 2019.01.27
Minimum Increment to Make Array Unique (in Python)  (0) 2019.01.25