给定两个非空链表,分别表示两个非负整数,每位数字按逆序存储,每个节点表示一位数字。将两个链表表示的数相加,并以同样的方式输出。
输入: l1 = [2,4,3], l2 = [5,6,4]
输出: [7,0,8]
解释: 342 + 465 = 807.
[1, 100]
内0 <= Node.val <= 9
class Solution:
def addTwoNumbers(self,l1:ListNode,l2:ListNode)->ListNode:
def sum(l1,l2,tmp):
tmp+=l1.val+l2.val
l1.val=tmp%10 #将余数赋值到当前节点
tmp//=10 #tmp整除10后得到进位值
if l1.next and l2.next:
return sum(l1.next,l2.next,tmp)
if l2.next:#如果l2更长,l1,l2互换
l1.next=l2.next
while l1.next and tmp:
l1=l1.next
tmp+=l1.val
l1.val=tmp%10
tmp//=10
if tmp:
l1.next=ListNode(1)
sum(l1,l2,0)
return l1
class Solution:
def addTwoNumbers(self,l1:ListNode,l2:ListNode)->ListNode:
cur=head=ListNode(None)
tmp=0
while l1 or l2 or tmp:
tmp+=(l1.val if l1 else 0)+(l2.val if l2 else 0)
cur.next=ListNode(tmp%10)#创建新节点
tmp//=10
cur=cur.next
l1 = l1.next if l1 else None
l2 = l2.next if l2 else None
return head.next
给定两个大小为m和n的正序数组nums1和nums2,请找出这两个数组合并后的中位数。
要求:时间复杂度控制在O(log(m+n))
输入: nums1 = [1,3], nums2 = [2]
输出: 2.00000
解释: 合并数组 = [1,2,3] ,中位数 2
输入: nums1 = [1,2], nums2 = [3,4]
输出: 2.50000
解释: 合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5
题意要求时间复杂度控制在O(log(m+n)),如果我们用第一反应将两个数组合并后排序,那么时间复杂度将达到O(m+n),所以参考了各种题解后,我觉得寻找第k小的数这种方法比较值得学习,而且这个方法适用性范围比较广。
题目中为两个正序数组,要找中位数,利用题解中讲到的寻找第k个数的方法,就是删除前二分之一的数。
做法是每次循环,删除前一般的数的前面一半,也就是对于前一半的数,每次保留后1/2, 这样最后只剩下了一个数,即中位数。
具体的做法:
t=min(k//2,len(l2))]
def findMedianSortedArrays(self, nums1: List\[int\], nums2: List\[int\]) -> float:
def findk(l1,l2,k):
if len(l1)<len(l2):
l1,l2=l2,l1
if len(l2)==0:
return l1[k-1]
if k==1:
return min(l1[0],l2[0])
t=min(k//2,len(l2))#确定删除范围的大小
if l1[t-1]<l2[t-1]:
return findk(l1[t:],l2,k-t)
else:
return findk(l1,l2[t:],k-t)
#取两个数然后求平均值
k1=(len(nums1)+len(nums2)+1)//2
k2=(len(nums1)+len(nums2)+2)//2
return (findk(nums1,nums2,k1)+findk(nums1,nums2,k2))/2
给定一个字符串,找出其中的最长的回文子串。
输入: s = “babad”
输出: “bab”
解释: “aba” 同样是符合题意的答案。
def expand(s,l,i,j):
while i>=0 and j<l and s[i]=s[j]:
i-=1
j+=1
return s[i+1:j],j-1-1
class Solution:
def longestPalindrome(self, s:str)->str:
#定义一个扩展字符串的函数
def expand(s,l,i,j):
while i>=0 and j<l and s[i]==s[j]:
i-=1
j+=1
return s[i+1:j],j-i-1
l=len(s)
if l<2:
return s
maxl=1
res=s[0]#以防没有回文子串
for i in range(l):
s1,l1=expand(s,l,i,i)
s2,l2=expand(s,l,i,i+1)
cur=s1 if l1>l2 else s2
if len(cur)>maxl:#若发现了更大的回文子串
maxl=len(cur)
res=cur
return res