Day01
两数相加 (Medium)
- 2. 两数相加 (Medium)
思路:暴力法和递归法,详细代码如下,见注释:
# Definition for singly-linked list.
class ListNode(object):
def __init__(self, val=0, next=None):
self.val = val
self.next = next
class Solution_baoli(object):
# 暴力解法
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
"""
:type l1: ListNode[9, 9, 9]
:type l2: ListNode[9, 9]
:rtype: ListNode
"""
# res为计算链表两两相加的结果,cur为可移动的result,digit初始化为0,是用于存放每一次链表相加后进位的数
res = ListNode()
cur = res
digit = 0
# 首先进来循环判断l1和l2
while l1 != None or l2 != None:
# 1.此时total为digit=0
# 2.此时进入第二次循环,total = digit = 1
# 3.此时进入第三次循环,total = digit = 1
total = digit
if l1 != None:
total += l1.val
l1 = l1.next
# 3.此时第三次循环l2 = None
if l2 != None:
total += l2.val
l2 = l2.next
# 1.算出此时两链表第一节点相加以后的进位数,此时total应为9+9=18,而digit则为18 // 10 = 1
# 2.算出此时两链表第二节点相加以后的进位数,此时total应为1+9+9=19,而digit则为19 // 10 = 1
# 3.算出此时两链表第三节点相加以后的进位数,此时total应为1+9=10,而digit则为10 // 10 = 1
digit = total // 10
# 1.初始res = 0
# 1.此时cur = res,所以cur往下走cur.next记录total与10的余数:18 % 10 = 8,所以res = 8,然后cur = cur.next,把cur继续往下走然后res不动
# 2.此时cur.next = 19 % 10 = 9,所以res = 9 然后cur = cur.next,把cur继续往下走然后res不动
# 3.此时cur.next = 10 % 10 = 0,所以res = 0 然后cur = cur.next,把cur继续往下走然后res不动,此时因为l1和l2都为None所以跳出while循环
cur.next = ListNode(total % 10)
cur = cur.next
# 3.跳出循环后,但是digit还有值为1,此时cur.next为ListNode(digit)即为1,,所以res = 1,所以res = [0, 8, 9, 0, 1]
if digit != 0:
cur.next = ListNode(digit)
# 4.此时res往下走,去除初始为0的位返回res.next = [8, 9, 0, 1]
return res.next
class Solution_recursion(object):
# 递归解法
# Time complexity: O(M + N)
# Space complexity: O(M + N)
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
"""
:type l1: ListNode[9, 9, 9]
:type l2: ListNode[9, 9]
:rtype: ListNode
"""
# total为l1和l2链表节点之和,digit为和的进位数,remain为和的余数,res为保存当前余数结果
# 1.首先进来,两链表第一节点相加total = 9 + 9 = 18,digit = 18 // 10 = 1,remain = 18 % 10 = 8,res = 8
# 2.total = 10 + 9 = 19,digit = 19 // 10 = 1,remain = 19 % 10 = 9,res = 9
# 3.total = 10 + 0 = 10,digit = 10 // 10 = 1,remain = 10% 10 = 0,res = 0
# 4.total = 1 + 0 = 1,digit = 1 // 10 = 0,remain = 1% 10 = 1,res = 1
total = l1.val + l2.val
digit = total // 10
remain = total % 10
res = ListNode(remain)
# 1.判断l1.next、l2.next和digit
# 4.此时l1.next、l2.next和digit均为None,返回res[8, 9, 0, 1]
if l1.next or l2.next or digit:
# 若满足条件:
# l1 = l1 = l1.next否则为ListNode(0) = 0
# l2 = l2 = l2.next否则为ListNode(0) = 0
l1 = l1.next if l1.next else ListNode(0)
l2 = l2.next if l2.next else ListNode(0)
# 1.令l1.val与进位数相加:9 + 1 = 10
# 2.令l1.val与进位数相加:9 + 1 = 10,此时l2.next已经没有了所以此时l2 = ListNode(0) = 0
# 3.令l1.val与进位数相加:0 + 1 = 1,此时l1.next、l2.next已经没有了所以此时l1 = l2 = ListNode(0) = 0
l1.val += digit
# 1.调用递归函数,total = 10 + 9 = 19
# 2.调用递归函数,total = 10 + 0 = 10
# 3.调用递归函数,total = 1 + 0 = 1
res.next = self.addTwoNumbers(l1, l2)
return res
寻找两个正序数组的中位数
from typing import List
class Solution_baoli(object):
# 暴力法
# 直接把两数组相加然后排序,判断此时数组长度的奇偶,并对应算出中位数
# Time complexity: O(M + N)
def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: float
"""
# nums = sorted(nums1 + nums2)
nums = nums1 + nums2
nums.sort()
l = len(nums)
if l % 2 == 0:
return (nums[l // 2] + nums[l // 2 - 1]) / 2
else:
return nums[l // 2]
最长回文子串
class Solution_baoli(object):
# 暴力法
def longestPalindrome(self, s: str) -> str:
"""
:type s: str
:rtype: str
"""
if s == s[::-1]:
return s
max_len = 1
res = s[0]
for i in range(len(s)-1):
for j in range(i + 1, len(s)):
if j - i + 1 > max_len and s[i:j+1] == s[i:j+1][::-1]:
max_len = j - i + 1
res = s[i:j+1]
return res