这里写目录标题
- [Leetcode142. 环形链表 II](#Leetcode142. 环形链表 II)
- [Leetcode287. 寻找重复数](#Leetcode287. 寻找重复数)
Leetcode142. 环形链表 II
题目描述
给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。
不允许修改 链表。
代码
python
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def detectCycle(self, head: Optional[ListNode]) -> Optional[ListNode]:
s_node = head
f_node = head
meet_flag = False
while(f_node and f_node.next and f_node.next.next):
f_node = f_node.next.next
s_node = s_node.next
if(s_node == f_node):
f_node = head
meet_flag = True
break
if(not meet_flag): return None
while(s_node != f_node):
f_node = f_node.next
s_node = s_node.next
return f_node
Leetcode287. 寻找重复数
题目描述
给定一个包含 n + 1 个整数的数组 nums ,其数字都在 [1, n] 范围内(包括 1 和 n),可知至少存在一个重复的整数。
假设 nums 只有 一个重复的整数 ,返回 这个重复的数 。
你设计的解决方案必须 不修改 数组 nums 且只用常量级 O(1) 的额外空间。
代码
python
class Solution:
def findDuplicate(self, nums: List[int]) -> int:
slow_node = 0
fast_node = 0
# floyd判圈算法,由于一定存在圈,作变化
while(True):
slow_node = nums[slow_node]
fast_node = nums[nums[fast_node]]
if(fast_node == slow_node):
fast_node = 0
break
while(fast_node != slow_node):
slow_node = nums[slow_node]
fast_node = nums[fast_node]
return fast_node