leetcode题---链表中的两数相加

解题思路一:最简单的,就是把两组组合成数字,再运用相加相加,再分拆各个数位上的数字。但这样做耗时太大

解题思路二:

先把两个数字个位数拿出来(例如题中的2和5),判断有没有进位(即是否大于9),若有进位,则carry=进位数 否则为0。然后当两个数字的十位上的数字相加时,还得把carry加上,再判断是否有进位。

(做加数问题一定要注意:整除操作和求余操作,与10整除能判断是否存在进位,与10求余操作能获得该数位上的数字):

如18+34: 4+8 =12, 12/10 = 1,所以进位carry为1,12%10 = 2,所以个位数上的数字为2 。然后是十位1+3:1+3+carry=5,5/10=0,进位为0就是没有进位,然后5%10 = 5,所以十位上的数字为5,所以18+34 = 52

代码:

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

class Solution:
    def addTwoNumbers(self, l1, l2):
        prenode = ListNode(0)
        lastnode = prenode
        carry = 0 #进位一开始为没有进位
        while carry or l1 or l2:
            carry, val = divmod(carry + (l1.val if l1 else 0) + (l2.val if l2 else 0), 10) #找出进位和各个数位上的数字
            lastnode.next = ListNode(val)
            lastnode = lastnode.next
            l1 = l1.next if l1 else None
            l2 = l2.next if l2 else None
        return prenode.next


def generateList(l: list):
    prenode = ListNode(0)
    lastnode = prenode
    for val in l:
        lastnode.next = ListNode(val)
        lastnode = lastnode.next
    return prenode.next


def printList(l: ListNode):
    while l:
        print("%d, " % (l.val), end='')
        l = l.next
    print('')


if __name__ == "__main__":
    l1 = generateList([1, 5, 8])
    l2 = generateList([9, 1, 2, 9])
    printList(l1)
    printList(l2)
    s = Solution()
    sum = s.addTwoNumbers(l1, l2)
    printList(sum)

 

拓展:

上提是链表中的数字是逆序的,就是500的话,链表中的数字放置是0-0-5,这样就方便我们从个位开始计算。但是如果500在链表的放置方式是5-0-0呢?那我们就需要先对链表进行逆序操作。具体的逆序操作如下图:

图中逆序链表的头节点是不动的,新的节点不是从链表尾部插入,而是从头节点head的后面插入。如一条链表的顺序为8-5-1,则逆序时,它依次进入新链表的顺序也是8-5-1,所以新链表从头节点开始读就是1-5-8了。

代码:

def reverseList(l:ListNode):
    new = ListNode(0)
    while l!=None:
        val = ListNode(l.val)
        val.next = new.next
        new.next = val
        l = l.next
    return new.next

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值