それで、最近の面接でプログラミングの質問を受けました。
2 つのリンクされたリストがあり、各ノードには 1 から 9 までの値が格納されます (数値の 1 つのインデックスを示します)。したがって、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(3n) の複雑さで実行されます。各配列入力を 1 回通過し、出力配列を作成するために 1 回。
改善点はありますか?より良いアルゴリズム...またはコードの改善
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;
}
}