【LeetCode】

002 两数相加

题目】给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

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

img

解答

​ 设置一个进位参数 o p op op,再设置一个 c u r r e n t current current,用来记录当前节点。逆序相加,从高位开始相加,进位符向下传递。

  1. 两个链表长度可能不一致,先计算长度一样的;考虑到两个数相加可能有进位,所以初始化一个进位符 o p op op

    op = 0
    head = l1
    while l1 and l2:
        sum = l1.val + l2.val + op
        op = sum//10
        l1.val = sum % 10
        current = l1
        l1 , l2 = l1.next,l2.next
    
  2. 将当前的节点指向较长的链表,判断他是否为空且 o p op op是否大于0;如果 o p op op大于0,就将 o p op op与较长链表剩下的数字相加;如果 o p op op小于0,说明没有进位,当前的节点指向较长的链表,就将当前节点与较长链表剩下的节点连接起来了

    if l1:
        current.next = l1
        while l1 and op>0:
            s = l1.val + op
            l1.val = s % 10
            op = s // 10
            current = l1
            l1 = l1.next
    else:
        current.next = l2
        while l2 and op>0:
            s = l2.val + op
            l2.val = s % 10
            op = s // 10
            current = l2
            l2 = l2.next
    
  3. 数据对应相加完成之后,检查最后的进位符是否大于0;如果大于0,将 o p op op转为节点 L i s t N o d e ( o p ) ListNode(op) ListNode(op),然后让当前节点的下一个节点指向 L i s t N o d e ( o p ) ListNode(op) ListNode(op)

    if op > 0:
        op = ListNode(op)
        current.next = op
    
  4. 因为head指向的是 l 1 l_1 l1的头节点,所以直接返回 h e a d head head

    return head
    
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值