leetcode(2.两数相加)

本文探讨了链表相加的问题,提出了一种通过翻转链表进行加法运算再翻转回原始顺序的方法。对比了使用math.pow()与10**i进行幂运算的优劣,介绍了两种链表加法实现方案,一种是翻转链表求和,另一种是利用进位标志进行逐位加法。

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

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

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

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

下面的这部分代码是自己写的,用的是比较传统的方法,就是将链表翻转,求和再翻转回去。思路算是比较简单,但是在操作的过程中也遇到一些问题,链表的操作,在笨的测试的时候费了一些功夫。中途在进行n次方计算的时候,最初用的是math.pow()的方法,发现在计算过程中总是会自动转换成科学计数法的方式来表达数字,这对后面的加和产生了一些影响。查找解决办法的时候有一些numpy的改进方法,发现对于自己的问题并不是很实用,后来直接转换了10**i这样的方式,发现解除了科学计数法的一些弊端。(148ms)

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution:
    def addTwoNumbers(self,l1, l2):
        ll1=Solution.getVal(l1)
        ll2=Solution.getVal(l2)
        ll4 = list(str(ll1+ll2))
        ll4.reverse()
        l3=ListNode(int(ll4[0]))
        l4=l3
        #重组链表
        for i in range(1,len(ll4)):
            l3.next=ListNode(int(ll4[i]))
            l3 = l3.next
        return l4
   

#将链表加和 
    def getVal(l1):
        ll1=0
        i=0
        while l1.next!=None:
            ll1+=int(l1.val*(10**i))
            i=i+ 1
            l1=l1.next
        ll1+=l1.val*(10**i)
        return ll1
def linkList(l1):
    lenl=len(l1)
    link1 = ListNode(l1[0])
    link2 = link1
    for i in range(1,lenl):
        link2.next=ListNode(l1[i])
        link2 = link2.next
    return link1

list1 = [2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,9]
list2 = [5,6,4,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,9,9,9,9]
l1 = linkList(list1)
l2 = linkList(list2)

官方题解的方式是有设计一个标志位,对于进位进行记录,并且对下一步的计算进行补加,代码如下(156ms):

class Solution:
    def addTwoNumbers(self, l1, l2):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        """
        re = ListNode(0)
        r=re
        carry=0
        while(l1 or l2):
            x= l1.val if l1 else 0
            y= l2.val if l2 else 0
            s=carry+x+y
            carry=s//10
            r.next=ListNode(s%10)
            r=r.next
            if(l1!=None):l1=l1.next
            if(l2!=None):l2=l2.next
        if(carry>0):
            r.next=ListNode(1)
        return re.next

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xushikou1514

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值