[程序员面试金典][JAVA][第02.01题][移除重复节点][Set][双指针]
生活随笔
收集整理的這篇文章主要介紹了
[程序员面试金典][JAVA][第02.01题][移除重复节点][Set][双指针]
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
【問題描述】[簡單]
編寫代碼,移除未排序鏈表中的重復節(jié)點。保留最開始出現(xiàn)的節(jié)點。示例1:輸入:[1, 2, 3, 3, 2, 1]輸出:[1, 2, 3] 示例2:輸入:[1, 1, 1, 1, 2]輸出:[1, 2] 提示:鏈表長度在[0, 20000]范圍內。 鏈表元素在[0, 20000]范圍內。 進階:如果不得使用臨時緩沖區(qū),該怎么解決?【解答思路】
1. Set/哈希集合
對給定的鏈表進行一次遍歷,并用一個哈希集合(HashSet)來存儲所有出現(xiàn)過的節(jié)點val
時間復雜度:O(N) 空間復雜度:O(N)
另一種寫法
public ListNode removeDuplicateNodes(ListNode head) {if(head == null){return null;}Set<Integer> set = new HashSet<>();ListNode pre =head;ListNode cur = head.next;set.add(head.val);while(cur!=null){if(set.contains(cur.val) ){pre.next = cur.next;// 連接到最后的nullcur= cur.next;}else{set.add(cur.val);pre = cur;cur =cur.next;}}return head;}2. 兩重循環(huán)(冒泡排序) 進階解法
在給定的鏈表上使用兩重循環(huán),其中第一重循環(huán)從鏈表的頭節(jié)點開始,枚舉一個保留的節(jié)點,這是因為我們保留的是「最開始出現(xiàn)的節(jié)點」。第二重循環(huán)從枚舉的保留節(jié)點開始,到鏈表的末尾結束,將所有與保留節(jié)點相同的節(jié)點全部移除。
第一重循環(huán)枚舉保留的節(jié)點本身,而為了編碼方便,第二重循環(huán)可以枚舉待移除節(jié)點的前驅節(jié)點,方便我們對節(jié)點進行移除。這樣一來,我們使用「時間換空間」的方法,就可以不使用臨時緩沖區(qū)解決本題了。
時間換空間
時間復雜度:O(N^2) 空間復雜度:O(1)
class Solution {public ListNode removeDuplicateNodes(ListNode head) {ListNode ob = head;while (ob != null) {ListNode oc = ob;while (oc.next != null) {if (oc.next.val == ob.val) {oc.next = oc.next.next;} else {oc = oc.next;}}ob = ob.next;}return head;} }【總結】
1.枚舉前驅節(jié)點 刪除節(jié)點方便
2.時間空間相互tradeoff
3.鏈表題目畫圖 切忌心煩意亂
轉載鏈接:https://leetcode-cn.com/problems/remove-duplicate-node-lcci/solution/yi-chu-zhong-fu-jie-dian-by-leetcode-solution/
總結
以上是生活随笔為你收集整理的[程序员面试金典][JAVA][第02.01题][移除重复节点][Set][双指针]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1001种玩法 | 1001种玩法--数
- 下一篇: 地理探测器 GD包下载及应用(R语言,基