繁体   English   中英

查找以链表表示的2个数字之和的最佳方法

[英]Most optimal way to find the sum of 2 numbers represented as linked lists

我正在尝试为上面提到的问题编写程序,数字(即列表)的长度可能不相等,除了最常见的方法,我无法找到一种方法来做到这一点,即

  1. 反向列表1
  2. 反向清单2
  3. 找到总和并将其存储在由list-3表示的新列表中
  4. 反转列表。

其复杂度应为O(n + m)。 是否有减少它的方法,或者做得更好?

理想情况下,我要做的第一件事是以相反的数字顺序存储数字,因此将43,712存储为:

2 -> 1 -> 7 -> 3 -> 4

它使算术运算容易得多

显示数字可以使用递归算法进行迭代或更简单地完成。 注意:所有这些均假定为单链列表。

编辑:但是您已经声明您在存储格式上别无选择。 因此,最好的选择是反转两个列表,进行加法,然后反转结果。

您可以做得更好,而无需列表反转。 我将假设两个列表的长度相等(如有必要,以0开头)。

从左到右(从最高有效位到最低有效位)开始加法。 您有两种情况,具体取决于两位数的总和:

  1. = 9:保留9并增加一个counter
  2. <9:写counter x九,写总和,复位counter
  3. 9:增加最后一位,写入counter ×0,写入和(模10),复位计数器

我将处理以下示例:

2 568 794 +
1 438 204
--------- =
4 006 998
  1. 2 + 1 = 3 :情况3。
    • list = (3)counter = 0
  2. 5 + 4 = 9 :情况1
    • list = (3)counter = 1
  3. 6 + 4 = 9 :情况1
    • list = (3)counter = 2
  4. 8 + 8 = 16 :情况3
    • list = (4, 0, 0, 6)counter = 0
  5. 7 + 2 = 9 :情况1
    • list = (4, 0, 0, 6)counter = 1
  6. 9 + 0 = 9 :情况1
    • list = (4, 0, 0, 6)counter = 2
  7. 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM