[トップ 101 の必見インタビュー] リンク リストのリングのエントリ ノードとリンク リストの最後の k ノード

目次

トピック: リンク リスト内のリンクのエントリ ノード_Niuke Question Ba_Niuke.com (nowcoder.com)

質問インターフェイス:

問題解決のアイデア:

コード:

合格した!

トピック: リンクされたリストの最後の k ノード_Niuke Topic_Niuke.com (nowcoder.com)

質問インターフェイス:

問題解決のアイデア:

コード:

合格した!

最後に次のように書きます。


トピック:リンク リスト内のリンクのエントリ ノード_Niuke Question Ba_Niuke.com (nowcoder.com)

質問インターフェイス:

package main

func EntryNodeOfLoop(pHead *ListNode) *ListNode {
    
}

問題解決のアイデア:

この問題には重要なポイントがあります。初めてやったときはわかりませんでしたが、一度やってみるとやり方がわかりました。理論的には数学的な証明があるはずですが、そうではありません数学が得意なのでやり方がわかりません。証明します。

ポイント:ヘッドノードから入口位置までの距離 == ファストポインタとスローポインタの交点位置から入口位置までの距離このルールに従ってコードを書くだけです。

コード:

package main

func EntryNodeOfLoop(pHead *ListNode) *ListNode {
    fast := pHead
    slow := pHead

    // 找到快慢指针相交的位置
    for fast != nil && fast.Next != nil {
        fast = fast.Next.Next
        slow = slow.Next
        if fast == slow {
            break
        }
    }

    // 头结点到入口位置的距离 == 快慢指针相交位置到入口位置的距离
    for fast != nil && pHead != nil && pHead.Next != nil {
        if fast == pHead {
            return fast
        }
        fast = fast.Next
        pHead = pHead.Next
    }
    
    return nil
}

合格した!

トピック:リンクされたリストの最後の k ノード_Niuke Topic_Niuke.com (nowcoder.com)

質問インターフェイス:

package main
import . "nc_tools"
/*
 * type ListNode struct{
 *   Val int
 *   Next *ListNode
 * }
 */

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param pHead ListNode类 
 * @param k int整型 
 * @return ListNode类 
*/
func FindKthToTail( pHead *ListNode ,  k int ) *ListNode {
    // write code here
}

問題解決のアイデア:

初めてこの質問を見たとき、私は実際に総当たりの解決策を考えました。最初にリンクされたリストの長さを激しく走査し、次に k の長さに基づいて最後の k 個のノードをインターセプトします。しかし、総当たりは明らかに最適ではありません。そこで、それを最適化する方法を考え始めました。

比較的単純な最適化のアイデアは、高速ポインタと低速ポインタです。中心となるアイデアは、高速ポインタを最初に k ステップ移動させ、次に 2 つのポインタを一緒に逆方向に移動させるというものです。高速ポインタが nil に達すると、低速ポインタは k 番目のステップになります。高速ポインタと低速ポインタは k 位置離れているため、下からの位置になります。

コード:

package main
import . "nc_tools"
/*
 * type ListNode struct{
 *   Val int
 *   Next *ListNode
 * }
 */

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param pHead ListNode类 
 * @param k int整型 
 * @return ListNode类 
*/
func FindKthToTail( pHead *ListNode ,  k int ) *ListNode {
    fast := pHead
    slow := pHead

    for i := 0; i < k; i++ {
        if fast == nil {
            return nil
        }
        fast = fast.Next
    }

    for fast != nil {
        fast = fast.Next
        slow = slow.Next
    }

    return slow
}

合格した!

最後に次のように書きます。

以上がこの記事の内容です、読んでいただきありがとうございます。

何かを得たと感じたら、ブロガーに「いいね! 」を与えることができます。

記事の内容に漏れや間違いがある場合は、ブロガーにプライベートメッセージを送信するか、コメント欄で指摘してください〜

おすすめ

転載: blog.csdn.net/Locky136/article/details/132868721