重磅乾貨,第一時間送達程序員
刪除鏈表中重複的結點面試
在一個排序的鏈表中,存在重複的結點,請刪除該鏈表中重複的結點,重複的結點不保留,返回鏈表頭指針。例如,鏈表1->2->3->3->4->4->5 處理後爲 1->2->5正則表達式
一開始以爲哇這題目好簡單,不過是找到須要刪除的節點,而後跳過該節點就好了。
思路A:新建一個哈希表,因爲鏈表是有序的,將全部的元素出現次數記錄下來,而後再開闢個鏈表還原現場。
咱們採用最容易想到的方法,不用考慮時間效率與空間效率問題,就直接用遍歷,用一個哈希表結構來記錄每一個節點對應的值在節點中出現了幾回,統計完成後,而後經過哈希表中若是出現次數爲大於等於2,再用兩個指針一個前一個後開始找對應的值就好了,若是後一個指針指向的節點的值爲哈希表中出現次數大於等於2的數,那麼前一個指針指向後一個指針的next而後刪除後一個指針所指向的節點,讓後一個指針從新指向前一個指針的next,就這樣就能夠完成刪除。算法
雖然這個方法能夠,可是時間複雜度爲O(N), 空間複雜度爲一個哈希表的結構,因此採用這種不是最佳選擇。
哈希表O(N),鏈表也是O(N),時間複雜度O(N)數組
思路B:思路A固然是暴力解法,要是空間有限制那就不行了。既然是鏈表結構,咱們就要學會巧用指針,一個指針不能知足需求那就用兩個指針,這樣空間複雜度能夠降到最小,時間複雜度即使是O(N+M)也能夠約等於O(N)微信
2.設置pre ,last指針, pre指針指向當前肯定不重複的那個節點,而last指針至關於工做指針,一直日後面搜索。數據結構
# -*- coding:utf-8 -*- # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: def deleteDuplication(self, pHead): # write code here if not pHead or pHead.next==None: return pHead Head=ListNode(0) Head.next=pHead pre=Head last=pHead while last!=None: if last.next!=None and last.val == last.next.val : while last.next!=None and last.val==last.next.val : last=last.next pre.next=last.next last=last.next else: pre=pre.next last=last.next return Head.next
if (pHead==null || pHead.next==null){return pHead;} ListNode Head = new ListNode(0); Head.next = pHead; ListNode pre = Head; ListNode last = Head.next; while (last!=null){ if(last.next!=null && last.val == last.next.val){ // 找到最後的一個相同節點 while (last.next!=null && last.val == last.next.val){ last = last.next; } pre.next = last.next; last = last.next; }else{ pre = pre.next; last = last.next; } } return Head.next;
注:面試季來了,不論是做爲面試者仍是之後做爲面試官,瞭解算法這門程序員之間的溝通方式都是很是必要的。找過工做的朋友應該都據說過《劍指offer》,雖然書中只有六十多道題目,可是道道都是經典。機器學習
若是是單純的面試需求,劍指offer的優先級確定是在Leetcode以前,總的說它有三個優勢:ide
它的缺點是:函數
2.動態規劃的題比較少,所以須要在Leetcode上專項訓練。
算法題主要分紅數據結構和具體算法部分,簡單歸類以下。基本每道題都很精彩,因此這裏就不一一洗寫了,題解能夠看看個人代碼倉庫或者討論區的內容。
如下是劍指offer題目,藍色爲已發佈鏈接。
劍指offer刷題交流羣
掃碼添加微信,必定要備註研究方向+地點+學校+暱稱(如機器學習+上海+上交+湯姆),只有備註正確才能夠加羣噢。
▲長按加羣