876.Leetcode876リンクリストの中間ノードは、速度ポインタのアイデアによって解決されます

876.Leetcode876リンクリストの中央ノード

タイトル説明

ヘッドノードがheadである空でない単一リンクリストが与えられた場合、リンクリストの中央ノードを返します。

中間ノードが2つある場合は、2番目の中間ノードに戻ります。

例1:

入力:[1,2,3,4,5]
出力:このリストのノード3(シリアル化された形式:[3,4,5])
返されるノード値は3です。(評価システムにおけるこのノードのシリアル化式は[3,4,5]です)。
次のようなタイプListNodeのオブジェクトansを返したことに注意してください:
ans.val = 3、ans.next.val = 4、ans.next.next.val = 5、ans.next.next.next = NULL。

例2:

入力:[1,2,3,4,5,6]
出力:このリストのノード4(シリアル化された形式:[4,5,6])
このリストには2つの中間ノードがあるため、値はそれぞれ3と4、2番目のノードに戻ります。

促す:

特定のリンクリスト内のノードの数は1から100の間です。

問題解決のアイデア

この問題は、高速ポインタと低速ポインタを使用することで解決できます。高速ポインタは一度に2マス移動し、低速ポインタは一度に1マス移動します。速いポインタが終わりに達したとき、遅いポインタはちょうど真ん中に行かなければなりません。
アイデアは次のとおりです。速度ポインタは同じ方向に移動し、それらのステップの「差」は一定です。この確実性に従って、リンクリストのいくつかの問題を解決します。この種の考え方を使用すると、リンクリストの次の問題も解決
できます。比率を使用して紙に描画し、理解を深めることができます。
ここに画像の説明を挿入
ここに画像の説明を挿入

滞在ボタン「質問19:最後から2番目のkノード、速い手は推測ではなく、紙に描くものをシミュレートするためにいくつかの手順を実行します。それは明らかです
。141ページの「電源ボタン」タイトル:円形のリンクリスト、リングができる場合想像してみてください。学生は100ドルを預け始め、1日1元を稼ぎ、Bの学生は50ドルを預け始め、1日2元を稼ぎ、Bの学生は1日で同じ金額を預け、学生は
「電源ボタン」質問142:循環リンクリストII;
「Likou」質問161:開始点が異なる交差するリンクリスト。それらが交わるように同じ長さを構築する場合も、同期ウォーキングの等しい関係を使用します。

public ListNode middleNode(ListNode head) {
      ListNode fast=head;
      ListNode slow=head;
      while(fast!=null&&fast.next!=null){
          fast=fast.next.next;
          slow=slow.next;
      }
      return slow;
    }

おすすめ

転載: blog.csdn.net/pjh88/article/details/114400216