2. 两数相加

2. 两数相加

题目描述

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

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

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

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

题解

这道题目给出的是两个链表的头。
要求输出的是求出的目的链表的头。

python代码
class Solution:
    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
        L2 = ListNode(0)  # 创建一个头节点
        L = L2  # 把头节点保留下来
        c = 0  # 进位标志
        while l1 is not None or l2 is not None:
            if l1 is not None and l2 is not None:  # 当两个连表都不为空时
                L0 = ListNode(0)  #先创建一个新的链表
                L0.val = (c + l1.val + l2.val) % 10
                c = (c + l1.val + l2.val) // 10
                L.next = L0  # 把新创建的节点接到目的链表的最后一个节点的next
                L = L.next  # 将三个链表都向后移动一个
                l1 = l1.next
                l2 = l2.next
            elif l2 is not None:
                L0 = ListNode(0)
                L0.val = (c + l2.val) % 10
                c = (c + l2.val) // 10
                L.next = L0
                L = L.next
                l2 = l2.next
            else:
                L0 = ListNode(0)
                L0.val = (c + l1.val) % 10
                c = (c + l1.val) // 10
                L.next = L0
                L = L.next
                l1 = l1.next

        if c != 0:  # 若最高有进位则再创建一个节点
            L.next = ListNode(c)

        L2 = L2.next  # 头结点里的数据不具有意义,不要!
        return L2
python完整代码
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
        L2 = ListNode(0)
        L = L2
        c = 0
        while l1 is not None or l2 is not None:
            if l1 is not None and l2 is not None:
                L0 = ListNode(0)
                L0.val = (c + l1.val + l2.val) % 10
                c = (c + l1.val + l2.val) // 10
                L.next = L0
                L = L.next
                l1 = l1.next
                l2 = l2.next
            elif l2 is not None:
                L0 = ListNode(0)
                L0.val = (c + l2.val) % 10
                c = (c + l2.val) // 10
                L.next = L0
                L = L.next
                l2 = l2.next
            else:
                L0 = ListNode(0)
                L0.val = (c + l1.val) % 10
                c = (c + l1.val) // 10
                L.next = L0
                L = L.next
                l1 = l1.next

        if c != 0:
            L.next = ListNode(c)

        L2 = L2.next
        return L2

def stringToIntegerList(input):
    return json.loads(input)

def stringToListNode(input):
    # Generate list from the input
    numbers = stringToIntegerList(input)

    # Now convert that list into linked list
    dummyRoot = ListNode(0)
    ptr = dummyRoot
    for number in numbers:
        ptr.next = ListNode(number)
        ptr = ptr.next

    ptr = dummyRoot.next
    return ptr

def listNodeToString(node):
    if not node:
        return "[]"

    result = ""
    while node:
        result += str(node.val) + ", "
        node = node.next
    return "[" + result[:-2] + "]"

def main():
    import sys
    import io
    def readlines():
        for line in io.TextIOWrapper(sys.stdin.buffer, encoding='utf-8'):
            yield line.strip('\n')

    lines = readlines()
    while True:
        try:
            line = next(lines)
            l1 = stringToListNode(line);
            line = next(lines)
            l2 = stringToListNode(line);
            
            ret = Solution().addTwoNumbers(l1, l2)

            out = listNodeToString(ret);
            print(out)
        except StopIteration:
            break

if __name__ == '__main__':
    main()
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值