LeetCode习题总结-算法(13)

第十三天LeetCode刷题-算法

第十三天习题——利用链表完成两个逆序数的加法操作

此题仅为个人总结参考,如有错误还请指出

首先先上原题:

来源:力扣(LeetCode)
原题链接:https://leetcode-cn.com/problems/add-two-numbers/

在拿到这道题的时候,乍一看会感觉很简单:不过是利用链表完成两个数的相加而已。但是,通过对题目的仔细分析,我们会发现,在设计整体算法的时候,我们需要考虑以下的几种边界和特殊情况:
(1)在计算的时候如果遇到相加满10的进位操作,需要对链表的下一位置进行相应的进位操作: 如342 + 465,我们可以发现在第二位中产生了相应的进位操作。 所以我们需要对最高位进行相应的进位操作。而在链表的中的体现即为对链表的最后一位进行相应的进位操作。而对于这个操作,我们可以通过利用地板除来实现对最高位的保留,并利用取余操作来实现对满10数中个位的保留
(2)、遇见两个长度不相等的数进行相加: 例如12+3456,在计算类似此类两个长度不相等的数字进行相加时,当对其中的一个链表遍历完成后,我们仍需要将稍长的那个链表中剩余的位数进行加零操作。而不应该对于长链表的剩余位弃之不顾。
(3)、当两个相同长度的数进行相加操作产生进位时: 如11 + 99,从结果可知,两数相加会产生相应进位操作。此时生成的结果是一个长度为3的链表且对应的两个列表完全为空。在此我们可以利用相应的地板除方式来实现对相同位数的数相加时的进位操作过程。

即于以上对该问题的分解和特殊情况的考虑,我们运用模除和地板除的方法来实现对两个链表所对应数的相加操作。

方法——利用模除和地板除的方式完成两数的加法之和

# Definition for singly-linked list.
class ListNode:
     def __init__(self, x):
         self.val = x
         self.next = None

class Solution:
    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
    	# 生成新的链表以完成对两数之和的保存
    	l = ListNode(0)
    	lhead = l
    	
    	# 设计一个计数器来完成每个链表节点对应值的加法操作
    	count = 0
    	
    	# 本题中循环条件结束的前提一定是两个链表都为空,且对应的计数器也为空才行;如果此处仅设置两链表为空作为判断条件,则会缺少对细节3的考虑,即相等位数的数相加产生的和长于原有的两个数。
    	while l1 or l2 or count:
    		count += (l1.val if l1 else 0) + (l2.val if l2 else 0)
    		
    		# 通过利用模除方法判断并保留生成和的最低位
    		lhead.next = ListNode(count % 10)
    		lhead = lhead.next
    		
    		# 利用地板除操作可以判断是否产生了进位操作
    		count = count // 10
    		
    		# 两个列表的指针分别向后移动一位
    		l1 = l1.next if l1 else 0
    		l2 = l2.next if l2 else 0

	return l.next
    		

该方法在执行器里面的执行所需的复杂度和内存消耗如下图所示: 虽然该方法消耗的时间和空间复杂度相对较多,但是总体来说,该方法还是比较容易通俗易懂的。
在这里插入图片描述

总结

其实,从这道题我们可以看出。所谓的算法,在很多时候,都是通过对数据之间的规律寻找,以及结合一些程序语言中的一些基础操作和思想,如本题的模除/地板除以及之前习题中的递归思想来完成相应的算法设计过程。所以,此后我们在面对算法设计的过程中,如果偶遇困难之处,我们可以通过找寻本题中特殊元素的之间的临界关系并结合算法中一些基础思想(如递归、分治、动态规划等)来实现对算法的设计操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值
>