鱼C论坛

 找回密码
 立即注册
查看: 20|回复: 0

[技术交流] 2. 两数相加

[复制链接]
发表于 3 天前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 Gnomeshgh 于 2025-7-19 14:18 编辑

一、题目描述


给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。



示例 1:
微信截图_20250717112401.png

输入: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
题目数据保证列表表示的数字不含前导零



二、解题思路


(一)暴力解
将链表转换为数字然后相加,最后在取每一个位进行插入链表。

微信截图_20250717112401.png

  1. # 链表转为数字
  2. def listNodeToNum(listnode):
  3.     # 保存最后的结果
  4.     num = 0
  5.     # 每次取一个数之后,会扩大十倍
  6.     count = 1
  7.     # 当链表为None时结束循环
  8.     while listnode:
  9.         num = num + count * listnode.val
  10.         count = count * 10
  11.         listnode = listnode.next
  12.     return num

  13. # 采用尾插法
  14. def numToListNode(num):
  15.     head = ListNode(num % 10)
  16.     rear = head
  17.     # 去掉个位
  18.     num = num // 10
  19.     # 当num为0时退出循环
  20.     while num:
  21.         node = ListNode(num % 10)
  22.         rear.next = node
  23.         rear = node
  24.         # 去掉个位
  25.         num = num // 10
  26.     return head

  27. class Solution:
  28.     def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
  29.         # 将链表转为数字
  30.         num1 = listNodeToNum(l1)
  31.         num2 = listNodeToNum(l2)

  32.         # 将数字相加
  33.         num2 = num2 + num1

  34.         #将数字转为链表
  35.         result = numToListNode(num2)

  36.         return result
复制代码


(二)双指针直接相加
两个指针分别指向两个链表的头部,依次取出数值,然后相加,结果取个位将十位进位。依次循环。
将加和的数字进行尾插。
下载.png
  1. class Solution:
  2.     def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
  3.         # 保存链表头部,以及当前指针
  4.         dummy = curr = ListNode(0)
  5.         # 进位标志
  6.         carry = 0
  7.         
  8.         # 如果两个链表都为空且进位为0就退出循环
  9.         while l1 or l2 or carry:
  10.             # 如果链表不为空就取值,为空就赋值为0
  11.             val1 = l1.val if l1 else 0
  12.             val2 = l2.val if l2 else 0
  13.             
  14.             # 直接取进位和个位
  15.             carry, out = divmod(val1 + val2 + carry, 10)
  16.             
  17.             # 插入链表
  18.             curr.next = ListNode(out)
  19.             curr = curr.next
  20.             
  21.             # 链表指针后移
  22.             l1 = l1.next if l1 else None
  23.             l2 = l2.next if l2 else None
  24.         
  25.         return dummy.next
复制代码



评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +5 收起 理由
青出于蓝 + 5 + 5 + 5 鱼C有你更精彩^_^

查看全部评分

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-22 01:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表