计算链表中的值的总和

rti*_*dru 6 java algorithm linked-list

我最近在接受采访时得到了一个编程问题.

有2个链接列表.每个节点存储1到9的值(表示数字的一个索引).因此123将是链接列表1-> 2-> 3

任务是创建一个函数:

static LinkedListNode getSum(LinkedListNode a, LinkedListNode b)

这将返回2个链表列表中的值的总和.

如果阵列a是:1-> 2-> 3-> 4

阵列b为:5-> 6-> 7-> 8

答案应该是:6-> 9-> 1-> 2

这是我的算法:

遍历a和b中的每个节点,将值作为整数获取并添加它们.使用这些值创建新的链接列表.

这是代码:它大概是我假设的复杂度为O(n).一旦通过每个数组输入并一次创建输出数组.

有什么改进?更好的算法......或代码改进

public class LinkedListNode {
        LinkedListNode next;
        int value;

    public LinkedListNode(int value) {
        this.value = value;
        this.next = null;
    }

    static int getValue(LinkedListNode node) {
        int value = node.value;
        while (node.next != null) {
            node = node.next;
            value = value * 10 + node.value;
        }
        return value;
    }

    static LinkedListNode getSum(LinkedListNode a, LinkedListNode b) {
        LinkedListNode answer = new LinkedListNode(0);
        LinkedListNode ans = answer;
        int aval = getValue(a);
        int bval = getValue(b);
        int result = aval + bval;
        while (result > 0) {
            int len = (int) Math.pow((double) 10,
                    (double) String.valueOf(result).length() - 1);
            int val = result / len;
            ans.next = new LinkedListNode(val);
            ans = ans.next;
            result = result - val*len;
            }    
        return answer.next;
    }
}
Run Code Online (Sandbox Code Playgroud)

dka*_*zel 3

我见过的针对此问题的其他解决方案包括通过向后迭代两个输入列表来增量构建返回的列表,同时在进入新列表时添加每个元素。这种方式比较复杂,因为您必须添加每个元素并处理结转。

如果数组a是:1->2->3->4

数组b为:5->6->7->8

向后迭代

然后 4 + 8 = 12 (返回列表当前 = 2)

携带 1

(1) + 3 + 7 = 11(返回列表 = 1-> 2)

携带 1

(1) + 2 + 6 = 9 (返回列表 = 9 -> 1 ->2 )

1 + 5 = 6(返回列表 = 6->9>1->2)

如果列表仅是单向链接,您可以通过使用堆栈来实现向后迭代的 LIFO 性质。

  • @rtindru 你的代码实际上不是 O(n) 。考虑一下当您有几百万个元素时。首先,该数字不适合“int”,您需要一个“BigInteger”。如果你完成了一半,你将把一个 50 万位数的数字乘以 10 - 这显然不需要恒定的时间(这是你的算法 O(n) 的要求)。 (3认同)