FIRE Wannabeの備忘録

毎月積立。

【LeetCode】No.25: Reverse Nodes in k-Group

 標題のとおりの25題目。日本語にすると「k倍数ノードグループ逆転」とかでしょうか。

 

求められているアルゴリズムは以下のとおり:

・所与の連結リスト内のノードを逆転させ、そのリストをリターンさせる

・正の数k (k >= len(linked list))の倍数のノードグループを逆転させ、余る部分は変わらず

 

例:

所与の連結リスト 1->2->3->4->5

k=2なら:2->1->4->3->5を返す、k=3なら:3->2->1->4->5返すようなアルゴリズム

 

 結論から言えば今日のやつも「なんじゃこれwwやーめたww」という感じになりました。わからないものは回答を見るにしても少なくとも5分くらいは考えるようにしていますが、連結リスト問題は苦手意識がありどうもうまく実装できるイメージがわきません。デバッガでポチポチとステップごとにローカル変数の変遷を追ってようやく「ほ〜〜ん🤔」という感じ。

 

 そもそもの連結リストの定義である以下の文。

class ListNode:

    def __init__(self, val=0, next=None):

        self.val = val

        self.next = next

 デフォルト値でvalに0、nextにNoneを指定していて「ああ、nextの方はデフォルトであれば2つ目以降をnullにするんだな」というのがなんとなくわかりますが、他方でvalの方は値をゼロにすんだっけ、インデックス0的な感じで最初の要素を指定するんだっけ・・?みたいな曖昧な感じでしか理解できていない。これではダメですね。

 

 さて、今回の問題は有料会員向けのみに回答が公開されているものなのでコードは省きますが大まかな手順は以下の通りでした:

・関数①で連結リスト内の先頭k個のノードを逆転させる。

・関数②で前述の関数でk個ノード逆転済みリストに残っているノードを逆転させる

(ex 所与の連結リストが[1,2,3,4,5]、k=2とすれば、関数①で先頭k個分逆転させたもの、つまり[2,1]が抽出され結果出力用スタックに入れられる。残りの[3,4,5]は関数②へ。この関数②の中で[3,4,5]を関数①に代入し[4,3,5]に並び替える。次に残った[5]が関数②の中で再帰して渡されるも1桁のため未処理でループから出てくる。スタックされている[2,1]と[4,3,5]が組み合わされて[2,1,4,3,5]をリターンで終わり!)

 

 ここ最近は1日1題Problemsのアルゴリズムを続けられていてこれで25個目(25日目)なんですが、「わかった!!」みたいに思えるブレークスルーまではかなり遠そうだぞという感覚です。

 

 普通のリストであればインデックス番号で[0]なり[1]なり指定して値を取得して〜ということができるのですが、この連結リスト問題はそうはいかずリストをwalkないしtraverseしないといけない。デバッガのローカル変数ウィンドウに出てこないスタックの部分を追えなかったり感覚的に理解できるまで結構な時間がかかりそう。こういうのちょちょいと組める人はどういう思考回路してるかすごい気になる。いつかその次元へ行けるのだろうか。。

 

Problems達成度:1.7% (25/1463)

理解度(主観):0.00001%