leetcode142 Linked List Cycle II

 1 """
 2 Given a linked list, return the node where the cycle begins. If there is no cycle, return null.
 3 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.
 4 Note: Do not modify the linked list.
 5 Example 1:
 6 Input: head = [3,2,0,-4], pos = 1
 7 Output: tail connects to node index 1
 8 Explanation: There is a cycle in the linked list, where tail connects to the second node.
 9 Example 2:
10 Input: head = [1,2], pos = 0
11 Output: tail connects to node index 0
12 Explanation: There is a cycle in the linked list, where tail connects to the first node.
13 Example 3:
14 Input: head = [1], pos = -1
15 Output: no cycle
16 Explanation: There is no cycle in the linked list.
17 """
18 """
19 判断链表是否有环。有两种做法
20 第一种是用set()存已经遍历过的结点
21 如果新的结点在set()里,则返回,有环
22 """
23 
24 class ListNode:
25     def __init__(self, x):
26         self.val = x
27         self.next = None
28 
29 class Solution:
30     def detectCycle(self, head):
31         nodes = set()
32         while head:
33             if head in nodes:
34                 return head
35             nodes.add(head)
36             head = head.next
37         return None
38 
39 """
40 解法二:快慢指针
41 A→B→C       快指针:A, C, B, D 一次走两步
42    ↖↓       慢指针:A, B, C, D
43     D
44 根据距离推算:相遇点距环入口的距离 = (头节点距环入口的距离)*(快指针步数-1)
45 快慢指针相遇在D,让快指针变为head
46 同步向后,再次相遇即为环的起点
47 """
48 
49 class ListNode:
50     def __init__(self, x):
51         self.val = x
52         self.next = None
53 
54 class Solution:
55     def detectCycle(self, head):
56         if head == None or head.next == None:
57             return None
58         slow, fast = head, head
59         while fast:
60             slow = slow.next
61             fast = fast.next
62             if fast:
63                 fast = fast.next
64                 if fast == slow:
65                     break
66         if slow != fast:
67             return None
68         fast = head #!!!关键所在
69         while slow:
70             if fast == slow:
71                 return fast
72             fast = fast.next
73             slow = slow.next

猜你喜欢

转载自www.cnblogs.com/yawenw/p/12324170.html
今日推荐