[英]Most optimal way to find the sum of 2 numbers represented as linked lists
我正在尝试为上面提到的问题编写程序,数字(即列表)的长度可能不相等,除了最常见的方法,我无法找到一种方法来做到这一点,即
其复杂度应为O(n + m)。 是否有减少它的方法,或者做得更好?
理想情况下,我要做的第一件事是以相反的数字顺序存储数字,因此将43,712存储为:
2 -> 1 -> 7 -> 3 -> 4
它使算术运算容易得多 。
显示数字可以使用递归算法进行迭代或更简单地完成。 注意:所有这些均假定为单链列表。
编辑:但是您已经声明您在存储格式上别无选择。 因此,最好的选择是反转两个列表,进行加法,然后反转结果。
您可以做得更好,而无需列表反转。 我将假设两个列表的长度相等(如有必要,以0开头)。
从左到右(从最高有效位到最低有效位)开始加法。 您有两种情况,具体取决于两位数的总和:
counter
counter
x九,写总和,复位counter
9:增加最后一位,写入
counter
×0,写入和(模10),复位计数器
我将处理以下示例:
2 568 794 +
1 438 204
--------- =
4 006 998
2 + 1 = 3
:情况3。
list = (3)
, counter = 0
5 + 4 = 9
:情况1
list = (3)
, counter = 1
6 + 4 = 9
:情况1
list = (3)
, counter = 2
8 + 8 = 16
:情况3
list = (4, 0, 0, 6)
, counter = 0
7 + 2 = 9
:情况1
list = (4, 0, 0, 6)
, counter = 1
9 + 0 = 9
:情况1
list = (4, 0, 0, 6)
, counter = 2
4 + 4 = 8
:情况2
list = (4, 0, 0, 6, 9, 9, 8)
, counter = 0
如果可以使用双向链接列表,则可以快速遍历每个列表的末尾,然后以自己的方式进行操作,在每个点处添加数字并将其添加到新列表中。
您将需要确定更长的列表,并根据较短列表的长度进行累加,然后完成汇总并添加更长的列表。
但是,总和可能超过一位,您会遇到一些问题,因此,如果发生这种情况,您将需要跟踪溢出并将其添加到下一个节点。
我认为如上所述没有更好的解决方案。 根本问题是必须以相反的顺序处理列表元素。 从理论上讲,您可以递归实现算法,而无需显式的逆向步骤。 但这需要O(max(m,n))
堆栈空间,并且很可能会更慢。
但是我认为这实际上是在说您选择的代表资格很差。 如果您代表的数字为双向链表int
或阵列int
(有明确的大小),复杂性将是O(max(m,n))
与比例较小的常数。
注意: O(max(m,n))
和O(m+n)
都是O
符号的滥用。 严格来说,当单个变量达到无穷大时, O
是用极限来定义的。 这样看, O(max(m,n))
和O(m+n)
都减小为O(m)
或O(n)
。 但是,我知道您要说的是:-)。
唯一可能的优化是将一些初始反转组合到单个循环中,而这会以一些代码清晰为代价。 然后,您从O(n + m + m)转到O(m + m),尽管循环内的步骤比较昂贵。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.