leetcode2. 两数相加python_链表

题目

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

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

你可以假设除了数字 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
题目数据保证列表表示的数字不含前导零

思路和代码

这题本来也没啥好写的,但是相比于之前自己刷这题用的笨方法,这次用了新方法,并对新方法做了一定的代码简化,心里很有成就感,所以还是记录一下吧。

笨方法:
就是先得到两个数的和,然后用一个列表存放这个数每个位上的值,再根据这个列表创建一个新链表。

代码:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
        def getNum(link):
            num1 = 0
            cur = link
            radix = 1
            while cur:
                num1 += cur.val*radix
                radix *= 10
                cur = cur.next
            return num1
        sum_value = getNum(l1) + getNum(l2)
       
        if sum_value == 0:
            return ListNode(0)
            
        res = []
        while sum_value:
            res.append(sum_value%10)
            sum_value //= 10
       
        dummy = ListNode(-1)
        node = dummy
        while res:
            cur = ListNode(res.pop(0))
            node.next = cur
            node = node.next
        return dummy.next

新方法:
对一位进行相加,有进位的话要加1,此外要考虑到两个链表可能不一样长,所以在第一个while循环里面,指向两个链表的指针都不为空,然后再有两个while循环,一个while循环处理第一个链表结束第二个链表还有值,另一个while循环处理第二个链表结束第一个链表还有值。这两个while循环只会执行一个,这让我想到了合并两个有序列表或者归并排序里面的merge函数。此外需要注意的是最后一位如果有进位,应该在加一个节点。

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
        cur_l1 = l1
        cur_l2 = l2
        dummy = ListNode(-1)
        cur = dummy
        getbit = 0
        while cur_l1 and cur_l2:
            num = cur_l1.val + cur_l2.val + getbit
            getbit = 0
            if num >= 10:
                getbit = num // 10
                num %= 10
            node = ListNode(num)
            cur.next = node
            cur = cur.next
            cur_l1 = cur_l1.next
            cur_l2 = cur_l2.next
            if cur_l1== None and cur_l2== None and getbit > 0:
                node = ListNode(getbit)
                cur.next = node


        while cur_l1:
            num = cur_l1.val + getbit
            getbit = 0

            if num >= 10:
                getbit = num // 10
                num %= 10
            node = ListNode(num)
            cur.next = node
            cur = cur.next
            cur_l1 = cur_l1.next
            if cur_l1== None and getbit > 0:
                node = ListNode(getbit)
                cur.next = node
        while cur_l2:
            num = cur_l2.val + getbit
            getbit = 0
            if num >= 10:
                getbit = num // 10
                num %= 10
            node = ListNode(num)
            cur.next = node
            cur = cur.next
            cur_l2 = cur_l2.next
            if cur_l2== None and getbit > 0:
                node = ListNode(getbit)
                cur.next = node

        return dummy.next

最后,上述的代码其实有很多重复的,三种情况可以放在一个while循环里面写的。加几句判断条件就行。(真有意思)

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
        cur_l1 = l1
        cur_l2 = l2
        dummy = ListNode(-1)
        cur = dummy
        getbit = 0
        while cur_l1 or cur_l2:
            num1 = cur_l1.val if cur_l1 else 0
            num2 = cur_l2.val if cur_l2 else 0
            num = num1 + num2 + getbit
            getbit = 0
            if num >= 10:
                getbit = num // 10
                num %= 10
            node = ListNode(num)
            cur.next = node
            cur = cur.next
            if cur_l1:
                cur_l1 = cur_l1.next
            if cur_l2:
                cur_l2 = cur_l2.next
            if cur_l1== None and cur_l2== None and getbit > 0:
                node = ListNode(getbit)
                cur.next = node
        return dummy.next
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值