当前位置: 首页 > news >正文

算法2--两数相加

题目描述

在这里插入图片描述

解题思路

题目说的很详细了,也就是把每个数倒序写成链表进行输入,然后让你计算两个倒序数组的和,要保证跟预期的结果一样。

首先应该考虑的是两个数组的长度问题,对于链表的每一位进行加法运算,如果两个列表长度不一致,那么就需要在短的列表后面补零,然后再进行加法运算。

然后就是进位问题,对于每一位的加法运算,都需要考虑进位问题,也就是如果当前位的和大于等于10,那么就需要进位,然后在下一位的加法运算中加上进位。这是这题的难点。

最后就是链表这一数据结构本身的要求,链表只能通过指针遍历来访问每一个节点,所以需要注意指针的指向。

开始手搓!

题目已经给了链表的定义,所以我们可以直接使用这个数据结构。题目给出的的定义如下:

Definition for singly-linked list.
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

根据定义,我们可以通过.val获取指针所指向节点的值,通过.next获取指针所指向节点的下一个节点。

最后解题

我们可以定义一个新的链表,保存最后的运算结果;定义一个变量保存进位的值;然后通过判断链表是否结束,进行加法运算来确定新链表最新位的值和下一次的进位的值。

然后链表的指针和新链表的指针全部后移,继续循环。如果循环结束后进位不为0,那么就需要在新链表的末尾加上一个值为1的节点。

最后返回新链表的头节点。

class Solution:
    def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
        res = cur = ListNode()
        adder = 0

        while l1 or l2:
            num1 = l1.val if l1 else 0
            num2 = l2.val if l2 else 0
            cur.next = ListNode((num1+num2+adder)%10)
            adder = (num1+num2+adder)//10

            cur = cur.next

            if l1: l1 = l1.next
            if l2: l2 = l2.next
        
        if adder: cur.next = ListNode(1)
        return res.next

尝试提交,通过,时间复杂度为O(Max(N,M)),其中N M为两个链表的长度。

在这里插入图片描述

相关文章:

  • 【nnUnetv2】Code分析
  • C++算法代码-植物生长算法求解多目标车辆路径规划问题
  • 从“不敢买大”到“按墙选屏”,海信电视如何凭百吋重构客厅?
  • 【Linux 维测专栏 1 -- Hung Task 分析与验证】
  • 第七章 狄克斯特拉算法
  • Python MRO 与菱形继承问题详解
  • 什么是 “超参数” ?
  • Android第五次面试总结(HR面)
  • 每日一题力扣1920.基于排列构建数组c++
  • FPGA 以太网通信(三)
  • 【达梦数据库】用户A删除用户B下的表数据
  • 【第15章】亿级电商平台订单系统-高可用架构设计
  • 协议-CAN-CANopen
  • Android音视频多媒体开源库基础大全
  • AD(Altium Designer)已有封装库的基础上添加器件封装
  • pytorch小土堆学习有感
  • 什么是TCP,UDP,MQTT?
  • Touch Diver:Weart为XR和机器人遥操作专属设计的触觉反馈动捕手套
  • BlockChain.java
  • 荣获全栈身份nodejs实现登录功能
  • 上汽享道出行完成13亿元C轮融资,已启动港股IPO计划
  • “一嗨租车”陷“五年后扣费”疑云,用户:违章处理莫名消失
  • 第一集|《刑警的日子》很生活,《执法者们》有班味
  • 上海楼市“银四”兑现:新房市场高端改善领跑,二手房量价企稳回升
  • 毗邻三市人均GDP全部超过20万元,苏锡常是怎样做到的?
  • 李公明︱一周书记:浪漫主义为什么……仍然重要?