编程实践笔记No.13
写在最前面,编程一直是我的短板,希望在leetcode练习中获得进步!
参考Datawhale组队学习中“LeetCodeTencent”
三道简单类别的题目,涉及链表、递归等知识点。
题目一160. 相交链表
编写一个程序,找到两个单链表相交的起始节点。
代码
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def getIntersectionNode(self, headA, headB):
if not headA or not headB:
return None
pa, pb = headA, headB
while pa != pb:
pa = pa.next if pa else headB
pb = pb.next if pb else headA
return pa
题目二169. 多数元素
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素
代码
暴力枚举
1 - 出现数字的集合,并按照集合统计出现次数;
2 - 判断出现次数是否大于总数的一半,大于则返回。
class Solution:
def majorityElement(self, nums: List[int]) -> int:
n = len(nums)
a_set = set(nums)
kind = len(a_set)
a_set_count = [0]*kind
# 双层for循环
for i in range(n):
for j in range(kind):
if nums[i]==list(a_set)[j]:
a_set_count[j]+=1
if a_set_count[j] > n/2:
return (list(a_set)[j])
怎么只用遍历一次,借鉴他人思路。
法一:排序中间的数
class Solution:
def majorityElement(self, nums: List[int]) -> int:
nums.sort() #这个时间复杂度不明
return nums[len(nums)//2]
法二:哈希表
class Solution:
def majorityElement(self, nums: List[int]) -> int:
n = len(nums)
if n == 1:
return nums[0]
max_count=n//2
hashmap = {}
for num in nums:
if num not in hashmap:
hashmap[num] = 1
continue
hashmap[num] += 1
if hashmap[num] > max_count:
return num
题目三206. 反转链表
反转一个单链表。
代码
双指针
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
pre = None
cur = head
while cur:
tmp = cur.next
cur.next = pre
pre = cur
cur = tmp
return pre