leetcode_136 + 141 只出现一次的数字+单链表判断环

本文探讨了Python中集合(set)在解决唯一数字问题和链表环判断中的重要作用。通过示例展示了如何利用集合来快速找出列表中只出现一次的数字,以及如何使用双指针技巧判断单链表是否存在环。这些方法揭示了集合和双指针在算法中的高效性和实用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

set也有很多用,不要只看到了dict的作用

  1. 只出现一次的数字
class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        '''
        di = {}
        for i in nums:
            if i not in di.keys():
                di[i] = 1
            else:
                di[i]+= 1
        print(di)
        return [k for k,v in di.items() if v==1][0]
        '''
        # 集合的方法
        # set 可以用来判断元素的个数!!!
        s = set()
        for i in nums:
            if i in s:
                s.remove(i)
            else:
                s.add(i)
        # print(s)
        return list(s)[0]

2. 单链表判断环

# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def hasCycle(self, head: ListNode) -> bool:
        '''set 可以用于解决重复问题   双指针可用于单链表是否有环的判断o(1)'''
        # set  自己写的
        
#         s = set()
#         node = head
#         while node:
            
#             if node not in s:
#                 s.add(node)
#                 node = node.next
#                 continue
#             return True
#         return False
        # 双指针 第一个指针 p1 每次移动两个节点,第二个指针 p2 每次移动一个节点,如果该链表存在环的话,第一个指针一定会再次碰到第二个指针,反之,则不存在环
        p1 = head
        p2 = head
        # 遍历的条件值得注意一下 ! ! !!!!!!!!!!!!!!!!!!!!!!!!!!p1比p2走得快,只判断p1即可
        while p1 && p1.next:
            p1 = p1.next.next
            p2 = p2.next
            
            if p1==p2:
                return True
        return False

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值