LeetCode刷题之路:两数相加

如果帮助到您,还请点个关注吧,hahaha

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

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

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

示例 1:

输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
示例 2:

输入:l1 = [0], l2 = [0]
输出:[0]
示例 3:

输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]

提示:

每个链表中的节点数在范围 [1, 100] 内
0 <= Node.val <= 9
题目数据保证列表表示的数字不含前导零

#最直观的思路
定义zero存放数字0,为了预防l1或l2的next为None
jinw为进位标志
result存放每次得到的结果
最初先判断若 cur1的值为0 且 cur1.next为None的话 证明cur1是空的(数字0)
则直接返回l2
同理判断l2是否为空
当l1和l2都不为空时,
则先计算l1、l2、jinw的和,若和大于等于10,则将进位标志变为1,同时将和-10,
只取差值就行。随后保存起来差值,并且取cur1和l2的下一个节点。
若节点为None,则用zero来代替。
当两个链表都遍历完后,我们直接将结果从新赋值给l1即可。
缺点:比较耗时

class Solution:
    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
        zero = ListNode(0)
        jinw = 0
        result = []
        cur1 = l1
        # print(l1)
        if cur1.val == 0 and cur1.next == None:
            return l2
        elif l2.val == 0 and l2.next == None:
            return l1
        else:
            while cur1 != None or l2 != None:
                a = cur1.val + l2.val + jinw
                jinw = 0
                if a >= 10:
                    jinw = 1
                    a -= 10
                result.append(a)
                cur1 = (cur1.next != None and cur1.next or zero)
                l2 = (l2.next != None and l2.next or zero)
                if cur1 == zero and l2 == zero:
                    if jinw == 1:
                        result.append(jinw)
                    break
            cur1 = l1
            # print (cur1)
            # print(result)
            # print(l1)
            for i in range(len(result)):
                cur1.val = result[i]
                if cur1.next == None and i != len(result) -1:
                    cur1.next = ListNode()
                cur1 = cur1.next
            print(l1)
            return l1
        # print (q)

#改进的思路
大致思路是一样的。只是在最初的时候定义一个新的链表l3直接用来存储运算结果。

class Solution:
    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
        jinw = 0
        l3 = ListNode(0)
        cur3 = l3
        while l1 or l2:
            a = l1.val if l1 else 0
            b = l2.val if l2 else 0
            c = a + b + jinw
            jinw = 0
            if c >= 10:
                jinw = 1
                c -= 10
            l3.next = ListNode(c)
            print (l3.val)
            l3 = l3.next
            l1 = l1.next if l1 else None
            l2 = l2.next if l2 else None
        if jinw:
            l3.next = ListNode(1)
        return cur3.next

猜你喜欢

转载自blog.csdn.net/as812252319/article/details/112254872
今日推荐