目次
トピック: リンク リスト内のリンクのエントリ ノード_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
}
合格した!!!
最後に次のように書きます。
以上がこの記事の内容です、読んでいただきありがとうございます。
何かを得たと感じたら、ブロガーに「いいね! 」を与えることができます。
記事の内容に漏れや間違いがある場合は、ブロガーにプライベートメッセージを送信するか、コメント欄で指摘してください〜