LeetCode #19 Remove Nth Node From End of List - 刷題之旅
1 題目描述
簡單來說,就是給定一個 linked list 和一個數字 n,要求刪除倒數第 n 個節點,並返回新的 linked list。
2 解法
2.1 我的解法
一開始想到的做法:
- 把所有位置的訊息存在一個 dict 裡面
- 然後因為已經遍歷過一次知道整個長度,直接尋找到要刪除的節點的前一個進行刪除。
1 |
|
空間複雜度為 O(n)。
時間複雜度為 O(n)。
如果題目要求 O(1) 這個方法就不行了。
2.2 雙指針
這個方法挺神的,從來沒想過,但是這個方法的時間複雜度為 O(n),空間複雜度為 O(1)。
這個方法的原理是,我們使用兩個指針,一個是 fast
,一個是 slow
,fast
比 slow
快 n 個節點,當 fast.next
到達最後一個節點時,slow
就是倒數第 n 個節點的前一個節點,這樣就可以直接刪除了。
我們可以簡單地將兩個指標錯開 n 個節點,方法是在啟動第二個指標(慢速)之前先讓第一個指標(快)先行
大概是這種感覺:
1 | class Solution: |
3 總結
自己的做法真的很單純,每次看到只能O(n)第一個想到的都是HashMap,很好笑,但是如果今天要求空間複雜度必須為O(1)的話,這個就無法了,必須使用雙指針的方法,來找到倒數第n個節點。因此如果今天題目要求one pass + 空間複雜度O(1)的話,就必須要使用雙指針的方法。
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Shannon's Blog 🐟 技術 | 生活 | 旅行! 如果你覺得我的文章有幫助,希望你可以到我的 github 給我一個 star ⭐️ Shannon Blog Repo
評論