Skip to content

142.linked list cycle ii#2

Open
ntanaka1984 wants to merge 2 commits into
mainfrom
142.Linked-List-Cycle-II
Open

142.linked list cycle ii#2
ntanaka1984 wants to merge 2 commits into
mainfrom
142.Linked-List-Cycle-II

Conversation

@ntanaka1984
Copy link
Copy Markdown
Owner

142.linked list cycle II をStep4 まで完了しました。
問題: https://leetcode.com/problems/linked-list-cycle-ii/description/
言語:C++
お手すきのときにレビュー何卒お願い申し上げます。

Copy link
Copy Markdown

@maeken4 maeken4 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

いいと思います!
Setを使った実装が標準的かとは思いますが、ややトリッキーな(思いつけなくてもいい)方法としてフロイトの循環検出アルゴリズムがあります。
コメント集https://docs.google.com/document/d/11HV35ADPo9QxJOpJQ24FcZvtvioli770WWdZZDaLOfg/edit?tab=t.0#heading=h.jfs03xpyyrfl
新井さんの解説
https://youtu.be/Oz7-VlcTpSQ

以下私の理解の確認のためにまとめたものですが…

headから速さ2で動くポインタfastと速さ1で動くポインタslowを考える。サイクルがある場合fastとslowはどこかで合流する。
単連結リストのheadを開始点、ループが始まる点を分岐点、fastとslowが合流する点を合流点と呼ぶ。

fastとslowが合流したあと、両者を同じ速さ1(今までのslowの速さ)でそれぞれが今来た道を同じ速さでslowが開始点に戻るまで同時に戻ることにしました。

この動きについて次の二点がわかります。

  • slowが分岐点から開始点に向かうタイミングまでslowとfastは一緒に動く。
  • 終了時にfastは合流点にいる(合流するまでの間fastはslowの二倍進んでいたため)。

このことから、slowを開始点、fastを合流点におき、それぞれを順方向に速さ1で動かして合流した点が分岐点と分かります。

@ntanaka1984
Copy link
Copy Markdown
Owner Author

コメントありがとうございます!tortoise and heir はwikipedia の記事などを読んでもわからなかったのですが、コメントを受けて自分なりに整理したことで理解が深まりました(図と式で表すと添付ファイルのようなことになるかと思います)。時間が空いたら実装してみようと思います。
スクリーンショット 2025-07-23 18 42 58

@maeken4
Copy link
Copy Markdown

maeken4 commented Jul 24, 2025

おおむね図に書いて頂いている内容でよいかと思いますが、合流点までにfastが動いた距離はX+Y+nL(nはfastが閉路を何周したか)になります。具体的にはXが他と比べて十分長い状況です。するとfastが合流点から出発してXだけ進むと、mod Lで分岐点にいることがわかります。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants