LeetCode第136题: 只出现一次的数字
- 由于其他的数字都会重复出现, 如果使用异或可以将其消除
class Solution:
def singleNumber(self, nums: List[int]) -> int:
result = nums[0]
for i in range(1, len(nums)):
result ^= nums[i]
return result
复杂度分析: 假设长度为n, 由于需要遍历数组, 那么复杂度为O(n)
LeetCode第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:
if head == None or head.next == None:
return False
p1 = head.next
p2 = head.next.next
while p1 != None and p2 != None:
if p2.next == None:
break
if p1 == p2:
return True
p1 = p1.next
p2 = p2.next.next
return False
复杂度: 时间复杂度O(n), 空间复杂度:O(1)
LeetCode第142题: 环形链表2
- 对每个遍历过的节点留下脚印, 如果当前正在遍历的节点有脚印, 那么把它返回即可
# 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:
i = 0
p = head
while p != None:
if hasattr(p, 'visited'):
return p
p.visited = i
p = p.next
i += 1
return None
时间复杂度: 需要遍历一遍链表, 如果链表长度为n, 复杂度为O(n), 空间复杂度O(n)