136 只出现一次的数字
注意异或操作满足交换率
x^0 = x
x^x = 0
# reduce
# 用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。
# ^异或操作
# x ^ 0 = x
# x ^ x = 0
# 所以当重复的元素进行异或操作以后,都变为0,只剩下一个不重复的元素。
class Solution:
def singleNumber(self, nums: List[int]) -> int:
# print(nums[0]^nums[1]^nums[2]^nums[3]^nums[4])
return reduce(lambda x,y : x^y, nums)
141 环形链表
# 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:
fast = head
slow = head
while fast and fast.next:
fast = fast.next.next
slow = slow.next
if slow == fast:
return True
return False
142 环形链表Ⅱ (返回环形入口节点)
fast 走的步数:f
slow走的步数:s
a 表示从head到环形入口的节点数,不包括入口点
b 表示环的长度
f = 2s
f = s + nb
则 s = nb
关键点,走a + nb一定是在环的入口节点
第一次相遇时,s已经走了nb步,再走a步就能走到节点入口,从head开始走a步也能走到节点入口,所以令fast = head, 第二次相遇的节点就是入口节点。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
# 返回环的入口节点的索引
class Solution:
def detectCycle(self, head: ListNode) -> ListNode:
if not head: return
fast = head
slow = head
while True:
if not (fast and fast.next): return
slow = slow.next
fast = fast.next.next
if slow == fast:
break
fast = head
# i = 0
while fast != slow:
fast = fast.next
slow = slow.next
return fast