leetcode 136\141\142

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值