108 ページのゲイル・ラークマンによるCrack The Coding Interviewという本から、リンクされたリストで表される 2 つの数値を加算するアルゴリズムを読んでいました。本を持っていない場合、質問、アルゴリズム、およびコードは次のとおりです。
質問
リンクされたリストで表される 2 つの数値があり、各ノードには 1 つの数字が含まれています。数字は逆順で格納され、1 の数字がリストの先頭になります。2 つの数値を加算し、連結リストとして um を返す関数を作成します。
例
入力:
(3->1->5),(5->9->2)
出力:
8->0->8
アルゴリズム
- result.data = (node1 + node2 +以前のキャリー) % 10
- node1 + node2 > 10 の場合、次の加算に 1 を繰り越します
- 2 つのノードのテールを追加し、キャリーを渡します
コード
LinkedListNode addLists(LinkedListNode l1, LinkedListNode l2, int carry) {
if (l1 == null && l2 == null) {
return null;
}
LinkedListNode result = new LinkedListNode(carry, null, null);
int value = carry;
if (l1 != null) {
value += l1.data;
}
if (l2 != null) {
value += l2.data;
}
result.data = value % 10;
LinkedListNode more = addLists(l1 == null ? null : l1.next, l2 == null ? null : l2.next, value > 10 ? 1 : 0);
result.setNext(more);
return result;
}
見た後に頭に浮かぶ明らかなことはif (l1 == null && l2 == null)
、両方の数字がヌルで、999 + 999 を追加するときのようにキャリーがまだある場合はどうなるかということです。それは間違った答えになるのでしょうか? それが正しい答えである場合、私にはその方法がわかりません。それが間違った答えである場合、どうすれば正しい答えを得ることができますか? 最初の数行を
LinkedListNode addLists(LinkedListNode l1, LinkedListNode l2, int carry = null) {
if (l1 == null && l2 == null) {
return carry;
}
トリックをしますか?