【LeetCode】2. 两数相加
测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。
怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~
一、题目描述:
-
题目内容
-
题目示例
-
题目解析
- 每个链表中的节点数在范围
[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的情况,需要进位
题目示例1结合上述思想我们画图演示如下:
根据上述思考,我们使用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提交代码记录如下:
- 时间复杂度O(max(n,m)),链表l1或者l2的长度
- 空间复杂度O(1)
以上是本期内容,欢迎大佬们点赞评论,下期见~~
转载自:https://juejin.cn/post/7111594121206169613