阿彦刷题日记【Python】--Leet code T2-两数相加

        一、题目详情

1.1题干

1.2输入、输出样例

1.3提示

二、题目分析

2.1题目解读

        这个题目理解起来也很简单,俩链表,从头开始加,一直加到头,如果某一个链表提前加没了,就不理它了呗。

        总体而言,☆☆【如果不知道链表基本操作可能会耽误一些】

2.2题目分析

        笔者认为,解决这个问题就需要解决以下几个问题:

①让链表当前指针(节点)往后移动

②如何处理进位

③如果链表中没有数如何处理

        对于第一个工作,处理方式就让每一次处理完后,让当前节点往后移即可,处理进位的方式,笔者采取的方式是将其记录在输出链表的后一个节点中,再下一次处理的时候进行计算。

        流程如下:

对于情况二(两个链表不等长),笔者在此处选择通过if判断,如果为空,就不加这个指即可

2.3代码

# 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]:
        n = l1.val + l2.val
        l3 = ListNode( n % 10 )
        l3.next = ListNode( n // 10 )
        p1 = l1.next
        p2 = l2.next
        p3 = l3
        while True:
            if p1 and p2:
                sum = p1.val + p2.val + p3.next.val
                p3.next.val = sum  % 10
                p3.next.next = ListNode(sum // 10) 
                p1 = p1.next
                p2 = p2.next
                p3 = p3.next
            elif p1 and not p2:
                sum = p1.val + p3.next.val
                p3.next.val = sum  % 10
                p3.next.next = ListNode(sum // 10)
                p1 = p1.next
                p3 = p3.next
            elif not p1 and p2:
                sum = p2.val + p3.next.val
                p3.next.val = sum  % 10
                p3.next.next = ListNode(sum // 10)
                p2 = p2.next
                p3 = p3.next
            else :
                if p3.next.val == 0:
                    p3.next = None
                break
        return l3


此代码对应运行效率

三、优化

        俗话说的好,没有绝对完美的运行效率,只有相比较完美的运行效率。

        在上述问题中,我们产生了两个问题:

1、我们是否可以不开辟节点去记录?

2、我们是否可以不用那么多if

        对于第一个问题,我们可以不为链表1,2创建节点

        对于第二个问题,我们可以思索,对进位的处理不放在当前的循环

3.1优化代码

# 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]:
        # 创建一个虚拟头节点以简化结果链表的处理
        dummy_head = ListNode(0)
        current = dummy_head
        # 记录进位
        carry = 0
        
        while l1 or l2 or carry:
            # 从节点获取值,如果节点为空则默认为0
            val1 = l1.val if l1 else 0
            val2 = l2.val if l2 else 0
            
            # 计算总和和进位
            total = val1 + val2 + carry
            carry = total // 10
            
            # 创建当前节点并添加到结果链表
            current.next = ListNode(total % 10)
            current = current.next
            
            # 移动到下一个节点
            if l1: l1 = l1.next
            if l2: l2 = l2.next
        
        # 返回结果链表的实际开始位置
        return dummy_head.next

运行效率

希望可以产生帮助哦~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值