LeeCode 445. 两数相加 II [中等 49.8%]

给定两个非空链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储单个数字。将这两数相加会返回一个新的链表。

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

进阶:

如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。

示例:

输入: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
输出: 7 -> 8 -> 0 -> 7

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class ListNode(object):
    def __init__(self, x):
        self.val = x
        self.next = None

class Solution(object):
    def setListValue(self, vals):
        # 赋值方法,将列表转换成带头结点的链表
        link = ListNode(None)
        p = link
        for val in vals:
            p.next = ListNode(int(val))
            p = p.next
        return link

    def flipList(self, l):
        # 头插法完成倒序,也可以用栈来实现
        link, p = ListNode(None), None
        link.next = p
        q = l.next
        while q.next is not None:
            l = q.next
            q.next = p
            link.next = q
            p = q
            q = l
        else:
            q.next = link.next
            link.next = q
        return link

    def addTwoNumbers(self, l1, l2):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        """
        l1, l2= self.setListValue(l1), self.setListValue(l2)
        # 反转链表
        l1, l2 = self.flipList(l1), self.flipList(l2)
        link = ListNode(None)
        p, q, l = l1, l2, link
        carry = 0  # 存储进位
        while (p.next is not None) and (q.next is not None):
            val = p.next.val + q.next.val + carry
            carry = int(val / 10)
            l.next = ListNode(val % 10)
            p, q, l = p.next, q.next, l.next

        # 两数长度不等
        while p.next is not None:
            val = p.next.val + carry
            carry = int(val / 10)
            l.next = ListNode(val % 10)
            p, l = p.next, l.next

        while q.next is not None:
            val = q.next.val + carry
            carry = int(val / 10)
            l.next = ListNode(val % 10)
            q, l = q.next, l.next

        if carry != 0:
            # 进位存在
           l.next = ListNode(carry)

        link = self.flipList(link)
        res = []
        while link.next is not None:
            res.append(link.next.val)
            link = link.next
        print(res)
        return res

if __name__ == '__main__':
    s = Solution()
    s.addTwoNumbers([7, 2, 4, 3], [5, 6, 4])
    s.addTwoNumbers([9, 9, 5, 4, 3], [5, 6, 4])

运行结果:

46c5660ce495b4010196705f845eb3697e8.jpg

注意点:

一定要考虑到结束之后进位变量里是否还存在进位,高位输出进位。

转载于:https://my.oschina.net/gain/blog/3084868

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值