leecode两数相加的两种解法

leecode两数相加的两种解法

问题描述:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
解决方法一:常规方法,只不过开始没理解题意,转来转去有点麻烦

class Solution:
    def addTwoNumbers(self, l1, l2):
        a1=[]
        a2=[]
        while(l1):#链表转列表
            a1.append(l1.val)
            l1=l1.next
        while(l2):
            a2.append(l2.val)
            l2=l2.next
        cin=0
        a3=[]
        len1=len(a1)
        len2=len(a2)
        
        if len1>len2:
            len2,len1=len1,len2#判断长短,保持len1是短的一个
            a1,a2=a2,a1
        for x in range(len1):
             a3.append(a2[x]+a1[x]+cin)
             cin=a3[x]//10
             a3[x]%=10
        for x in range(len1,len2,1):
            a3.append((a2[x]+cin))
            cin=a3[x]//10
            a3[x] %= 10
        if cin==1:
            a3.append(cin)
                  
        #新建两个空链表
        tmp_node=ListNode(None)
        node=ListNode(None) 
        #从后往前遍历和字符串,插入链表
        str1=""
        for x in a3[::-1]:
            str1+=str(x)  
        for x in str1[::-1]:
            # print(x)
            if not tmp_node.val:
                tmp_node.val=x
                node=tmp_node
               
            else:
                tmp_node.next=ListNode(x)
                tmp_node=tmp_node.next
                    
        return node


效果如下,好在还算是可以
效果如上

方法二:这个方法直接用链表实现,省去了转换的步骤,代码精简了许多:

class Solution:
    def addTwoNumbers(self, l1, l2):
        list_head=ListNode(0)#头结点为0
        list_now,cin=list_head,0   #cin 是进位    
        while l1 or l2:#只要有一个就继续
            sum1=0
            if l1 :
                sum1=l1.val
                l1=l1.next
            if l2:
                sum1+=l2.val               
                l2=l2.next
            sum1+=cin
            cin=sum1//10
            sum1%=10
            list_now.next = ListNode(sum1)
            list_now=list_now.next
        if cin==1:#对最后一位进位的处理
            list_now.next=ListNode(cin)               
        return list_head.next   
     

效果不错!
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值