LeetCode Hot100题——2、两数相加

这篇文章详细介绍了如何使用Python解决两个逆序链表相加的问题,通过双链表操作,逐位相加并处理进位。60ms的时间复杂度使得它在链表操作中高效实用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:

输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
输入:l1 = [0], l2 = [0]
输出:[0]
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]

python:

方法一:双链表,依次按位相加,取整则为进位的数值,取余同时考虑上一位的进位则为计算的当前节点的数值,同时注意链表均遍历完后需要检查是否有进位值。耗时60ms。

# 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:
        k = 0 # 计算已有的节点数目
        result = ListNode(val=0, next=None) # 移动中的尾节点
        head = result # 头节点
        keep = 0 # 进一位时,需要保留的数
        while l1 != None or l2 != None:
            sum = keep
            keep = 0
            if l1 != None:
                sum += l1.val
                l1 = l1.next
            if l2 != None:
                sum += l2.val
                l2 = l2.next
            node = ListNode(val=0, next=None)
            node.val = sum % 10 # 取余则为当前节点的值
            keep += sum // 10 # 取整则为进一位时保留的值
            if k == 0: # 如果当前为头节点
                head = node
                result = node
            else:
                result.next = node
                result = result.next
            k += 1
        if keep != 0: # 运算结束时最后一位的进位,追加到尾部
            node = ListNode(val=0, next=None)
            node.val = keep
            result.next = node

        return head

### 力扣热 HOT 100 中与 Python 相关的目及解决方案 力扣(LeetCode)上的热门目列表——HOT 100 是许多开发者练习算法和数据结构的重要资源。以下是几个典型的 HOT 100 目及其对应的 Python 解决方案概述。 #### 两数之和 (Two Sum) 这是一个经典的入门级问,目标是从给定数组中找到两个数,使它们相加等于指定的目标值。可以通过哈希表来优化查找过程[^2]。 ```python def twoSum(nums, target): hashmap = {} for i, num in enumerate(nums): complement = target - num if complement in hashmap: return [hashmap[complement], i] hashmap[num] = i ``` #### 最长连续序列 (Longest Consecutive Sequence) 此问是关于如何高效地找出未排序整数数组中最长的连续元素序列。可以利用集合的数据结构特性实现 O(n) 时间复杂度的解决方法[^3]。 ```python def longestConsecutive(nums): nums_set = set(nums) max_length = 0 for num in nums_set: if num - 1 not in nums_set: current_num = num current_streak = 1 while current_num + 1 in nums_set: current_num += 1 current_streak += 1 max_length = max(max_length, current_streak) return max_length ``` #### 字符串中的所有字母异位词 (Find All Anagrams in a String) 该问要求在一个较长字符串中定位所有的短字符串的字母排列位置。滑动窗口技术配合字符计数能够有效解决问。 ```python from collections import defaultdict def findAnagrams(s, p): result = [] need = defaultdict(int) window = defaultdict(int) for c in p: need[c] += 1 left = right = valid = 0 start = length = 0 while right < len(s): c = s[right] right += 1 if c in need: window[c] += 1 if window[c] == need[c]: valid += 1 while right - left >= len(p): if valid == len(need): result.append(left) d = s[left] left += 1 if d in need: if window[d] == need[d]: valid -= 1 window[d] -= 1 return result ``` #### 和为 K 的子数组 (Subarray Sum Equals K) 这个问涉及计算一个数组中有多少个连续子数组其元素总和恰好等于 k 值。通过前缀和以及字典存储中间状态可达到线性时间效率。 ```python def subarraySum(nums, k): count = total_sum = 0 sums_dict = {0: 1} for num in nums: total_sum += num if (total_sum - k) in sums_dict: count += sums_dict.get(total_sum - k, 0) sums_dict[total_sum] = sums_dict.get(total_sum, 0) + 1 return count ``` 以上仅展示了部分 HOT 100 列表内的经典习及其基于 Python 实现的核心逻辑。更多具体案例可通过链接访问官方文档获取进一步学习资料[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值