likes
comments
collection
share

【LeetCode】2. 两数相加

作者站长头像
站长
· 阅读数 15

【LeetCode】2. 两数相加

测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。

怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~

一、题目描述:

  • 题目内容

    【LeetCode】2. 两数相加

  • 题目示例

    【LeetCode】2. 两数相加

  • 题目解析

    • 每个链表中的节点数在范围 [1, 100] 内
    • 0 <= Node.val <= 9
    • 题目数据保证列表表示的数字不含前导零

二、思路分析:

我们拿到本题,与我们之前做的两数之和题目相似哎,但是又不一样,本题是关于两个链表节点值相加,结果返回一个计算和的新链表。在解答之前,题目中的细节点我们也需要get到:

  • 本题给出的链表都是非空链表
  • 链表中存储的链数据都是非负整数,0或正整数
  • 链表的存储顺序为逆向存储

我们之前也做过关于链表的题目,如合并两个有序链表,关于链表的结构是由val和next指针组成。

在链表中节点指针都是指向开始节点,当我们要在链表移到指针时,我们需要重新定义一个指针来指向链表,这样对原始的链表数据不会进行刷新和更改

  • 定义一个res的新链表: res = ListNode(None)
  • res指针一直指向的是None的节点
  • 如果需要保留res原始数据,则需要重新定义一个指针指向res链表 如cur = res
  • cur 指针移到 cur.next时,res链表中也会添加cur.next新节点数据信息

搞清楚链表的指针的移动和数据更新方法,解答本题只需要思路也比较清晰,大致思想如下:

  • 两数相加是十进制计算,每一位存储是相加的和再加上进制nodecur对10进行取余(nodesum % 10)
  • 当和大于10时,需要考虑进制问题,使用nodecur变量来存储,计算形式是(nodesum/10)
  • 每一个结点求出的数字都需要创建一个ListNode结点,赋值给cur.next更新给res链表中
  • 直到遍历完l1或者l2链表,返回res.next的值
  • 注意:遍历条件还需要添加 nodecur !=0 来判断 最高位是0的情况,需要进位 【LeetCode】2. 两数相加

题目示例1结合上述思想我们画图演示如下:

【LeetCode】2. 两数相加

根据上述思考,我们使用Python可以轻松实现,代码如下所示:

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution(object):
    def addTwoNumbers(self, l1, l2):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        """
        res = ListNode(None)
        cur = res
        nodecur = 0

        while l1 or l2 or nodecur !=0:
            L1 = l1.val if l1 else 0
            L2 = l2.val if l2 else 0
            nodesum = L1 + L2 + nodecur

            nodecur = nodesum / 10
            sumnode = ListNode(nodesum % 10)
            cur.next = sumnode
            cur = sumnode

            if l1: l1 = l1.next
            if l2: l2 = l2.next
        
        return res.next
        

三、总结:

本期考察我们对链表数据结构,指针移到和值更新进行掌握。同时两数相加需要考虑到进制问题和最高位为0情况,AC提交代码记录如下:

【LeetCode】2. 两数相加

  • 时间复杂度O(max(n,m)),链表l1或者l2的长度
  • 空间复杂度O(1)

以上是本期内容,欢迎大佬们点赞评论,下期见~~