ダミーの節で 2 本の並んだ連結リストを 1 本にまとめる

小さい​順に​並んだ​ 2 本の​連結リストを、​小さい​順のまま​ 1 本に​つなぎ直して​返します。​ダミーの​節を​先頭に​置き、​2 本の​先頭を​比べて​小さい​方を​つなぐ​練習です。

海外で定番の問題リスト 4 本のうち 4 本に入っています (Blind 75、NeetCode 150、Grind 75、LeetCode Top Interview 150)

問題

小さい順に並んだ 2 本の連結リストの先頭 head1 と head2 を受け取ります。2 本の節を全部使い、小さい順に並んだ 1 本のリストにつなぎ直して、その先頭の節を返す関数を書いてください。

  • 各節は val (値) と next (次の節) を持ちます。最後の節の next は、Python では None、JavaScript では null、Go では nil です。Go の節は ListNode で、Val、Next と大文字で始まります
  • どちらのリストも小さい順に並んでいます。同じ値が続くこともあります
  • 今ある節のつなぎ先を付け替えてまとめてください。比べるための目印の節 (ダミー) は 1 つ作ってかまいません
  • どちらか、または両方のリストが空のこともあります。両方が空なら空のまま返します
  • それぞれの節の数は 0 以上 50 以下、値はどれも -100 以上 100 以下です

例では、リストを先頭から読んだ値の並びで書きます。

入力と出力の例

例 1

同じ値の 5 は、両方とも残ります。

入力

head1 = [2, 5, 9]
head2 = [1, 5, 6, 12]

出力

[1, 2, 5, 5, 6, 9, 12]

例 2

片方が空なら、もう片方がそのまま答えです。

入力

head1 = []
head2 = [4, 7]

出力

[4, 7]

例 3

両方とも空です。

入力

head1 = []
head2 = []

出力

[]

面接での聞かれ方

連結リストの基本として、とてもよく出ます。

  • 「並んだ 2 本の連結リストを、並んだ 1 本にまとめてください」
  • 書き終えたあとに「k 本のリストならどうしますか?」と続きを聞かれることがあります。2 本ずつまとめる書き方と、優先度付きの待ち行列 (ヒープ) で k 本の先頭を比べる書き方があり、後者はシニアの問題です
  • 「ダミーの節を使わずに書けますか?」「再帰でも書けますか?」と、書き方を変えて聞かれることもあります

ジュニアの問題なので、片方が先に尽きたときと、空のリストが来たときを、余分な場合分けなしに書けるかが見られます。

アルゴリズムのチートシートの「配列と文字列」に、​この​型の​要点を​表と​コードで​まとめています。

main.py
def merge_sorted_lists(head1, head2):
    # 連結リストの節は val、next を持ちます。最後の next は None です
    # ここに書きます
    pass


# 「実行」を押すと、この行の結果が出ます
# build_list は並びから連結リストを組みます
print(list_values(merge_sorted_lists(build_list([2, 5, 9]), build_list([1, 5, 6, 12]))))

できているか「例で確かめる」を押すと、問題の例を全部この関数に渡して、通ったかをここに出します