2.两数相加

题目描述:
  • 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
  • 示例:
    • 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807
python代码:
  • 1.暴力解法:
# 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
        """
        list1 = []
        list2 = []
        while l1:
            list1.insert(0, str(l1.val))
            l1 = l1.next
        while l2:
            list2.insert(0, str(l2.val))
            l2 = l2.next
        num = str(int(''.join(list1)) + int(''.join(list2)))
        nums = list(num)
        li = ListNode(nums[-1])
        Li = li
        for i in range(len(nums) - 2, -1, -1):
            li.next = ListNode(nums[i])
            li = li.next
        li.next = None
        return Li
  • 2.改进代码(完整版):
    • 思路:使用变量来跟踪进位,并从包含最低有效位的表头开始模拟逐位相加的过程。
    • 时间复杂度: O ( m a x ( m , n ) ) O(max(m, n)) O(max(m,n)),假设 m m m n n n 分别表示 l 1 l1 l1 l 2 l2 l2 的长度。
class ListNode(object):
    def __init__(self, x):
        self.val = x
        self.next = None

class AList(object):
    def __init__(self):
        self.root = None
    def add(self, x):
        node = ListNode(x)
        if self.root is None:
            self.root = node
            return
        tempnode = self.root
        while tempnode.next:
            tempnode = tempnode.next
        tempnode.next = node
        return

def list_travel(root):
    if root is None:
        return
    while root:
        print(root.val)
        root = root.next

def addTwoNumbers(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

if __name__ == "__main__":
    l1 = AList()
    l1.add(2)
    l1.add(4)
    l1.add(3)

    l2 = AList()
    l2.add(5)
    l2.add(6)
    l2.add(4)

    l3 = addTwoNumbers(l1.root, l2.root)
    list_travel(l3)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值