Python 两数相加 Add Two Numbers Leetcode No.2

32 篇文章 1 订阅
29 篇文章 0 订阅

Python 两数相加 Leetcode No.2


思路很简单,模拟小学加法运算就好了,因为是逆序的,头指针指向的那个其实就是个位,往后加就完事,但是唯一需要注意的是,最高位可能有进位。(属于代码练习题)
ps:还有人说先把数全部取出来,用计算机加法算完,再建立链表连接起来,乍一看有点投机取巧好像可行的样子,但是我们要考虑计算和的时候会溢出。
还有人考虑直接在原来的链表上改数字,多一位的话,就再加一个链表,首先不知道leetcode允不允许改数字,毕竟这种题目也是考察你的链表能力,其次就算可以改,也没那个必要,毕竟就算少个几百个节点,问题也不大就是了。

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

class Solution(object):
    def addTwoNumbers(self, l1, l2):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        """
        #进位
        add = 0
        #这是两个头节点
        l3 = l4 = ListNode(0)
        while True:  
        #算节点的和  
            if l1 or l2:
                if l1:
                    sum =l1.val + add
                    if l2: 
                        sum += l2.val
                elif l2:
                    sum = l2.val +add
                    if l1:
                        sum +=l1.val
            else:
                sum = add
            add = 0
            #判断是否给add赋值
            if sum // 10 >0:
                add = 1
                sum %= 10
            #为新节点赋值
            l3.val = sum
            
            l1 = l1.next if l1 else l1
            l2 = l2.next if l2 else l2
            #创建新的链表
            if l1 or l2 or add:
                l3.next = ListNode(0)
                l3 = l3.next
            else:
                break
        return l4

ps:分享很多国外人写的代码,就感觉卧槽,还可以这么写,思路大家都一样,写法会有很多不同哦

#第一个老外写的,用了str
class Solution:
    def addTwoNumbers(self, l1, l2):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        """
        str_l1, str_l2 = '', ''
        while l1:            
            str_l1 += str(l1.val)
            l1 = l1.next
        while l2:            
            str_l2 += str(l2.val)
            l2 = l2.next
        int_l1 = int(str_l1[::-1])
        int_l2 = int(str_l2[::-1])       
        return list(map(int, str(int_l1 + int_l2)[::-1]))
#第二个老外写的,用了divmod,有点意思哈
# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def addTwoNumbers(self, l1, l2):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        """
        result = ListNode(0)
        result_tail = result
        carry = 0
                
        while l1 or l2 or carry:            
            val1  = (l1.val if l1 else 0)
            val2  = (l2.val if l2 else 0)
            carry, out = divmod(val1+val2 + carry, 10)    
                      
            result_tail.next = ListNode(out)
            result_tail = result_tail.next                      
            
            l1 = (l1.next if l1 else None)
            l2 = (l2.next if l2 else None)
               
        return result.next
#第三个老外用了递归写的,可以看看
# Definition for singly-linked list.
class ListNode(object):
    def __init__(self, x):
        self.val = x
        self.next = None

        
def printList(nodeStart):
    print(nodeStart.val)
    if nodeStart.next == None:
        return
    else:
        printList(nodeStart.next)

class Solution(object):
    def addTwoNumbers(self, l1, l2):
            
        if l1 == None:
            return l2
            
        if l2 == None:
            return l1
            
        sval = l1.val + l2.val
        if sval < 10:
            ansNode = ListNode(sval)
            ansNode.next = self.addTwoNumbers(l1.next, l2.next)
            return ansNode
        else:
            rval = l1.val + l2.val-10
            ansNode = ListNode(rval)
            ansNode.next = self.addTwoNumbers(ListNode(1), self.addTwoNumbers(l1.next, l2.next))
            return ansNode

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值