LeetCode #82 Remove Duplicates From Sorted List II - 刷題之旅
1 題目描述
簡單來說,在有序的listNode中,移除鍊錶中重複的元素,只留下沒有重複的元素。
2 解法
首先要注意的是,題目提到的是有序的鍊錶,這樣就可以很簡單的使用pointer解決這個問題。
一開始我的解法很蠢,我自己都不太想放上來了…我用三個指標,這導致我花了30分鐘才寫完,不僅僅很攏長可讀性還不高。後來我看到有人的解答是用雙指針,這樣就簡單多了。大概重新用雙指針思考一次題目,7分鐘就寫完了。
首先我們會需要兩個指針:
pre
用來記錄重複的前一個元素,這樣才可以把pre.next
接到沒有重複的元素上cur
跟cur.next
這兩個會不斷的比較,如果相鄰的兩個元素val
相同pre
保持原地不動- (while loop)
cur
要一直往下走直到cur.val
跟cur.next.val
不相同
- 如果發現
pre.next
與cur
不同時,就要重新接到最新的cur
上
大概是這種感覺
1 | def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]: |
爛死的三指針做法不要參考
但是你會發現,很多神韻的雙指針也是這樣處理:
fast
就像cur.next
slow
就是cur
pre
就是pre
while fast and slow.val == fast.val
就跟 雙指針的while cur.next and cur.val == cur.next.val
一樣
1 | def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]: |
時間複雜度: 雖然while裡面有while,但是每個元素只會被訪問一次
空間複雜度: 因為使用了指針,不需要額外的空間
3 總結
這題不難,一看到是有序的,就應該馬上想到使用pointer解決。只是我錯在使用三個指針,導致寫的很複雜,花了30分鐘才完成,後來看到別人的解法,才發現原來可以這樣簡單解決,因此再重新寫一次,6分鐘就寫完了。
這題的重點就是如果只是比較隔壁關係使用1個pointer比較鄰居就好,另一個pointer放previous的訊息,這樣就可以很快解決這個問題。
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Shannon's Blog 🐟 技術 | 生活 | 旅行! 如果你覺得我的文章有幫助,希望你可以到我的 github 給我一個 star ⭐️ Shannon Blog Repo
評論