2. 两数相加
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储一位数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
【示例 1】输入:l1 = [2,4,3], l2 = [5,6,4] 输出:[7,0,8]
解释:342 + 465 = 807.
【示例 2】输入:l1 = [0], l2 = [0] 输出:[0]
【示例 3】输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9] 输出:[8,9,9,9,0,0,0,1]
提示:
- 每个链表中的节点数在范围 [1, 100] 内
- 0 <= Node.val <= 9
- 题目数据保证列表表示的数字不含前导零
首次作答
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
carry = 0
val = l1.val + l2.val + carry
self.val = val % 10
if val >= 10:#如果两数加和大于等于10则进1
carry = 1
else:
carry = 0
if l1.next and l2.next:#当前两个链表均不是最后一个节点,则正常计算
if carry == 1:
l1.next.val += 1
elif (l1.next != None and l2.next != None):#当前两个链表均为最后一个节点,则分情况结束
if val >= 10:
self.next = ListNode(1,None)
return self
elif (l1.next and l2.next != None) or (l1.next != None and l2.next):#只有l2是最后一个节点,则l2增加新节点辅助判断
if l1.next:#l1未结束,则给l2增加节点
l2.next = ListNode(0,None)#创建节点
else:#l2未结束,则给l1增加节点(需要判断有没有进位
l1.next = ListNode(carry,None)
输出结果:
【错误1】发现没有实际输出
【原因】可能没太弄清楚机制
【错误2】发现进位机制有错
【疑问1】没有理解self的实际含义
【解释】可以理解为self是指当下自身的一个状态或者环境
【疑问2】尝试了print结果之后,发现只有第一个输出,说明只进行了第一组的加和,没有自动往下进行,所以还是需要自己写,但是不能嵌套当前函数,需要自己想办法?
【解释】发现了调试后台,看了下其他代码,应该是完成一步就可以了,但是还需要看下前后代码确定具体需要什么功能
尝试思路:
1、设置初始总链表,以及指针节点和进位符
2、如果当前节点均为非空,则相加并判断是否需要进位
3、如果下一节点有其中一个链表为空节点,则增加0值节点补齐链表
4、如果链表均结束,但进位符仍为1,则在末尾增加一个节点
5、输出
代码:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
node = ListNode(0,None)
newl = node
carry = 0
while l1 != None and l2 != None:
sumn = l1.val + l2.val + carry
node.next = ListNode(sumn % 10, None)
l1 = l1.next
l2 = l2.next
node = node.next
carry = 0 if sumn // 10 == 0 else 1
if l1 == None and l2 != None:
l1 = ListNode(0, None)
elif l1 != None and l2 == None:
l2 = ListNode(0, None)
node.next = ListNode(carry, None) if carry == 1 else None
return newl.next
4. 寻找两个正序数组的中位数
给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的中位数。
**进阶:**你能设计一个时间复杂度为 O(log (m+n)) 的算法解决此问题吗?
【示例 1】输入:nums1 = [1,3], nums2 = [2] 输出:2.00000 解释:合并数组 = [1,2,3] ,中位数 2
【示例 2】输入:nums1 = [1,2], nums2 = [3,4] 输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5
【示例 3】输入:nums1 = [0,0], nums2 = [0,0] 输出:0.00000
【示例 4】输入:nums1 = [], nums2 = [1] 输出:1.00000
【示例 5】 输入:nums1 = [2], nums2 = [] 输出:2.00000
提示:
- nums1.length == m
- nums2.length == n
- 0 <= m <= 1000
- 0 <= n <= 1000
- 1 <= m + n <= 2000
-10^6 <= nums1[i], nums2[i] <= 10^6
尝试思路:
1、将原数组合并成一个数组并排序
2、通过合并数组的长度找到中间或者中间两个数,确定中位数
代码:
class Solution:
def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
for i in range(len(nums2)):
nums1.append(nums2[i])
nums1.sort()
l = len(nums1)
if l % 2 == 0:
median = (nums1[l // 2 - 1] + nums1[l // 2 ]) / 2
else:
median = nums1[l // 2]
return median
对时间复杂度计算不是很行,所以进阶没有做
5. 最长回文子串
给你一个字符串 s,找到 s 中最长的回文子串。
【示例 1】输入:s = “babad” 输出:“bab”
解释:“aba” 同样是符合题意的答案。
【示例 2】输入:s = “cbbd” 输出:“bb”
【示例 3】输入:s = “a” 输出:“a”
【示例 4】输入:s = “ac” 输出:“a”
提示:
- 1 <= s.length <= 1000
- s 仅由数字和英文字母(大写和/或小写)组成
暂时没有思路