一魚多吃 用雙指針找出串列的中點 Middle of Linked list_Leetcode #876

閱讀時間約 2 分鐘

題目敘述

題目會給我們一個鏈結串列的起點head,要求我們找出這個串列的中點

註:

如果串列長度偶數,就回傳中間偏右的那個節點。

例如:

1 -> 2 -> 3 回傳中點為2

1 -> 2 -> 3 -> 4 ->5 -> 6 回傳中點為4


詳細的題目可在這裡看到


測試範例

Example 1:

raw-image
Input: head = [1,2,3,4,5]
Output: [3,4,5]
Explanation: The middle node of the list is node 3.

Example 2:

raw-image
Input: head = [1,2,3,4,5,6]
Output: [4,5,6]
Explanation: Since the list has two middle nodes with values 3 and 4, we return the second one.

約束條件

Constraints:

  • The number of nodes in the list is in the range [1, 100].
  • 1 <= Node.val <= 100

演算法

想像鏈結串列就是一條筆直的跑道,我們所要做的就是找出跑道的中點

可以用雙指針的技巧找出來,在這邊用兩個跑著做比喻。

快的跑者每一回合跑兩單位長(想像方便,也可以假想成兩公尺/秒),

慢的跑者每一回合跑一單位長(想像方便,也可以假想成一公尺/秒)。

兩者同時起跑當快的跑者抵達終點時慢的跑者會剛好位在整條跑道的中央點

image

image


程式碼

class Solution:
 def middleNode(self, head: Optional[ListNode]) -> Optional[ListNode]:

  slow = fast = head

  while fast and fast.next:

 # fast runner​
   fast = fast.next.next
   # slow runner​
   slow = slow.next

  return slow

複雜度分析

時間複雜度:

O( n )

從頭到尾,利用fast runner 快跑者拜訪一遍,長度和原本的串列一樣長O(n)

O( 1 )

使用到的變數都是臨時變數,皆為固定尺寸大小,為常數等級O(1)。


關鍵知識點

聯想到跑道模型快、慢雙指針的技巧,可以用雙指針優雅地在一次迴圈拜訪的條件下找出串列的中點位置。


Reference:

[1] Python/JS/Java/Go/C++ O(n) by two-pointers 90%+ [w/ Diagram] - Middle of the Linked List - LeetCode

avatar-img
90會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
題目會給定一個帶有Random Pointer的鏈結串列,要求我們實體複製deep copy這條鏈結串列,並且輸出副本的根結點。
題目會給定我們一個串列,和一個n值,要求我們刪除尾巴數來的第n個節點。 例如 1->2->3->4->5 和 給定n值=2,要求我們刪除尾巴數來的第2個節點。 尾巴數來的第2個節點是4,刪除之後,更新連結,輸出答案如下 1->2->3->5
題目會給我們兩條已經從小到大排序好的串列,要求我們依照從小到大的順序,合併這兩條串列。
題目的輸入會給我們一個串列,要求我們從頭到尾反轉整個串列。 例子: 如果輸入是1 -> 2 -> 3,那麼輸出就是 3 -> 2 -> 1
題目會給定一個帶有Random Pointer的鏈結串列,要求我們實體複製deep copy這條鏈結串列,並且輸出副本的根結點。
題目會給定我們一個串列,和一個n值,要求我們刪除尾巴數來的第n個節點。 例如 1->2->3->4->5 和 給定n值=2,要求我們刪除尾巴數來的第2個節點。 尾巴數來的第2個節點是4,刪除之後,更新連結,輸出答案如下 1->2->3->5
題目會給我們兩條已經從小到大排序好的串列,要求我們依照從小到大的順序,合併這兩條串列。
題目的輸入會給我們一個串列,要求我們從頭到尾反轉整個串列。 例子: 如果輸入是1 -> 2 -> 3,那麼輸出就是 3 -> 2 -> 1
你可能也想看
Google News 追蹤
在這篇文章中,我們將深入探討 LeetCode 題目「2. Add Two Numbers」的解法。這道題目考察對鏈結串列 (Linked List) 操作和進位處理的掌握。
Thumbnail
特性要因圖(魚骨圖)是一種視覺化工具,用來識別和分析導致特定問題或結果的潛在原因。因其形狀像魚骨而得名 魚骨圖有兩總用法,用於找問題時,魚頭朝右,用於尋找對策時,魚頭朝左 基本結構如下: 1-主題:寫在魚頭位置,魚頭在右邊,表示要分析找問題。 2-主幹:從魚頭延伸出來的水平線,為問題的中心線
Thumbnail
可選串聯(?.)運算符用於訪問 object 的屬性或調用函數。如果使用該運算符訪問的object 或調用的函式為 undefined 或 null,則表達式會回傳 undefined,而不是拋出錯誤。
Thumbnail
分享在網路上看到的陣列題目。通常 for...of 的 value 是陣列中的每個值,那如果我們在迭代中對陣列操作會發生什麼事? 題目來源:https://x.com/_jayphelps/status/1774640511158022335?s=20
Thumbnail
Node 對我來說一直是很似懂非懂的概念,因為沒有實際可見的數字或字串實物可以觀察中間步驟,比起其他解題抽象許多。以下解題方法來自網友與 GPT 提供的答案,我想在本文中嘗試自己做視覺化圖解,說明 CodeWars - Can you get the loop ? 的解題思路。
Thumbnail
「A是B/B在A」主題為讓小朋友了解許多事情與物品像是一串一串的連結,讓孩子們能理解一樣物品背後會有很多連結。 認識柑橘類水果,哪個是柳丁?哪個是
Thumbnail
本文介紹了串列運算式的應用,以及與Lambda匿名函式方法的比較,並提供了程式範例。串列運算式提供了一種簡潔的語法,用於創建、轉換和過濾列表。lambda函式用於創建匿名函式,通常用於簡單的操作。建議在比較複雜的情況下使用一般for迴圈加if來表示。
Thumbnail
題目 : 28. Find the Index of the First Occurrence in a String
Thumbnail
一魚多吃 Linea + 銘文 + Particle Network,今天晚上按頭打 邀請: https://ally.build?inviteCode=AAE6J2 https://ally.build?inviteCode=QOCT15 https://ally.build?inviteC
在這篇文章中,我們將深入探討 LeetCode 題目「2. Add Two Numbers」的解法。這道題目考察對鏈結串列 (Linked List) 操作和進位處理的掌握。
Thumbnail
特性要因圖(魚骨圖)是一種視覺化工具,用來識別和分析導致特定問題或結果的潛在原因。因其形狀像魚骨而得名 魚骨圖有兩總用法,用於找問題時,魚頭朝右,用於尋找對策時,魚頭朝左 基本結構如下: 1-主題:寫在魚頭位置,魚頭在右邊,表示要分析找問題。 2-主幹:從魚頭延伸出來的水平線,為問題的中心線
Thumbnail
可選串聯(?.)運算符用於訪問 object 的屬性或調用函數。如果使用該運算符訪問的object 或調用的函式為 undefined 或 null,則表達式會回傳 undefined,而不是拋出錯誤。
Thumbnail
分享在網路上看到的陣列題目。通常 for...of 的 value 是陣列中的每個值,那如果我們在迭代中對陣列操作會發生什麼事? 題目來源:https://x.com/_jayphelps/status/1774640511158022335?s=20
Thumbnail
Node 對我來說一直是很似懂非懂的概念,因為沒有實際可見的數字或字串實物可以觀察中間步驟,比起其他解題抽象許多。以下解題方法來自網友與 GPT 提供的答案,我想在本文中嘗試自己做視覺化圖解,說明 CodeWars - Can you get the loop ? 的解題思路。
Thumbnail
「A是B/B在A」主題為讓小朋友了解許多事情與物品像是一串一串的連結,讓孩子們能理解一樣物品背後會有很多連結。 認識柑橘類水果,哪個是柳丁?哪個是
Thumbnail
本文介紹了串列運算式的應用,以及與Lambda匿名函式方法的比較,並提供了程式範例。串列運算式提供了一種簡潔的語法,用於創建、轉換和過濾列表。lambda函式用於創建匿名函式,通常用於簡單的操作。建議在比較複雜的情況下使用一般for迴圈加if來表示。
Thumbnail
題目 : 28. Find the Index of the First Occurrence in a String
Thumbnail
一魚多吃 Linea + 銘文 + Particle Network,今天晚上按頭打 邀請: https://ally.build?inviteCode=AAE6J2 https://ally.build?inviteCode=QOCT15 https://ally.build?inviteC