每日算法題 | 劍指offer 鏈表專題 (8) 刪除鏈表中重複的結點

重磅乾貨,第一時間送達程序員

每日算法題 | 劍指offer 鏈表專題 (8) 刪除鏈表中重複的結點

題目

刪除鏈表中重複的結點面試

題目要求

在一個排序的鏈表中,存在重複的結點,請刪除該鏈表中重複的結點,重複的結點不保留,返回鏈表頭指針。例如,鏈表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)微信

  1. 首先添加一個頭節點,以方便碰到第一個,第二個節點就相同的狀況

2.設置pre ,last指針, pre指針指向當前肯定不重複的那個節點,而last指針至關於工做指針,一直日後面搜索。數據結構

也就是說只有當last指針肯定了這個元素只出現一次,pre接上,若是這個元素出現屢次,last請你遍歷到下一個元素從新開始判斷出現的次數。

可能出現的狀況:

(1)1->1 [從第一個元素開始到最後一個元素都是同一個元素]

(2) 1->2->2 [第一個元素保留 後面的元素爲同一元素]

(3) 1->2->2->3 [第一個元素保留 後面的元素爲同一元素 最後一個元素不重複]

(4) 1 [只有一個元素]

(5) 1->1->2->2->3->3 [全部出現的元素個數都超過了1]

每日算法題 | 劍指offer 鏈表專題 (8) 刪除鏈表中重複的結點

這道題目在牛客網上的經過率還不到20%,仍是比較難AC的一道題目!

代碼實現

Python :

# -*- 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

JAVA

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

  • 1.極可能在面試中出現原題
  • 2.約66題,題量少,可是涵蓋的內容較全
  • 3.能培養一個良好的刷題習慣

它的缺點是:函數

  • 1.只有66題,刷着容易過擬合
  • 2.動態規劃的題比較少,所以須要在Leetcode上專項訓練。
    算法題主要分紅數據結構和具體算法部分,簡單歸類以下。基本每道題都很精彩,因此這裏就不一一洗寫了,題解能夠看看個人代碼倉庫或者討論區的內容。

    如下是劍指offer題目,藍色爲已發佈鏈接。

    數據結構類題目

  • LinkedList
  • 003-從尾到頭打印鏈表
  • 014-鏈表中倒數第k個結點
  • 015-反轉鏈表
  • 016-合併兩個或k個有序鏈表
  • 025-複雜鏈表的複製
  • 036-兩個鏈表的第一個公共結點
  • 055-鏈表中環的入口結點
  • 056-刪除鏈表中重複的結點
  • Tree
  • 004-重建二叉樹
  • 017-樹的子結構
  • 018-二叉樹的鏡像
  • 022-從上往下打印二叉樹
  • 023-二叉搜索樹的後序遍歷序列
  • 024-二叉樹中和爲某一值的路徑
  • 026-二叉搜索樹與雙向鏈表
  • 038-二叉樹的深度
  • 039-平衡二叉樹
  • 057-二叉樹的下一個結點
  • 058-對稱的二叉樹
  • 059-按之字形順序打印二叉樹
  • 060-把二叉樹打印成多行
  • 061-序列化二叉樹
  • 062-二叉搜索樹的第k個結點
  • Stack & Queue
  • 005-用兩個棧實現隊列
  • 020-包含min函數的棧
  • 021-棧的壓入、彈出序列
  • 044-翻轉單詞順序列(棧)
  • 064-滑動窗口的最大值(雙端隊列)
  • Heap
  • 029-最小的K個數
  • Hash Table
  • 034-第一個只出現一次的字符
  • 065-矩陣中的路徑(BFS)
  • 066-機器人的運動範圍(DFS)
  • 具體算法類題目
  • 斐波那契數列
  • 007-斐波拉契數列
  • 008-跳臺階
  • 009-變態跳臺階
  • 010-矩形覆蓋
  • 搜索算法
  • 001-二維數組查找
  • 006-旋轉數組的最小數字(二分查找)
  • 037-數字在排序數組中出現的次數(二分查找)
  • 全排列
  • 027-字符串的排列
  • 動態規劃
  • 030-連續子數組的最大和
  • 052-正則表達式匹配(我用的暴力)
  • 回溯
  • 065-矩陣中的路徑(BFS)
  • 066-機器人的運動範圍(DFS)
  • 排序
  • 035-數組中的逆序對(歸併排序)
  • 029-最小的K個數(堆排序)
  • 029-最小的K個數(快速排序)
  • 位運算
  • 011-二進制中1的個數
  • 012-數值的整數次方
  • 040-數組中只出現一次的數字
  • 其餘算法
  • 002-替換空格
  • 013-調整數組順序使奇數位於偶數前面
  • 028-數組中出現次數超過一半的數字
  • 031-整數中1出現的次數(從1到n整數中1出現的次數)
  • 032-把數組排成最小的數
  • 033-醜數
  • 041-和爲S的連續正數序列(滑動窗口思想)
  • 042-和爲S的兩個數字(雙指針思想)
  • 043-左旋轉字符串(矩陣翻轉)
  • 046-孩子們的遊戲-圓圈中最後剩下的數(約瑟夫環)
  • 051-構建乘積數組

劍指offer刷題交流羣

掃碼添加微信,必定要備註研究方向+地點+學校+暱稱(如機器學習+上海+上交+湯姆),只有備註正確才能夠加羣噢。

每日算法題 | 劍指offer 鏈表專題 (8) 刪除鏈表中重複的結點
▲長按加羣

每日算法題 | 劍指offer 鏈表專題 (8) 刪除鏈表中重複的結點

相關文章
相關標籤/搜索