IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【JZ76 删除链表中重复的结点】 -> 正文阅读

[数据结构与算法]【JZ76 删除链表中重复的结点】

描述

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表 1->2->3->3->4->4->5 处理后为 1->2->5

数据范围: 链表长度满足 0 ≤ n≤ 1000 ,链表中的值满足 1 ≤ val ≤ 1000

进阶: 空间复杂度 O(n) ,时间复杂度 O(n)

例如输入{1,2,3,3,4,4,5}时,对应的输出为{1,2,5},对应的输入输出链表如下图所示:

在这里插入图片描述
示例1

输入:{1,2,3,3,4,4,5}

返回值:{1,2,5}

示例2

输入:{1,1,1,8}

返回值:{8}

方法一:哈希表

具体做法:

  1. 可以遍历一次链表用哈希表记录每个结点值出现的次数,然后在链表前加一个结点值为0的表头(返回的时候,直接返回dummy->next,加表头是为了防止删除时全部结点删完了)。
  2. 再次遍历该链表,对于每个结点值检查哈希表中的计数,只留下计数为1的,其他情况都删除。

复杂度分析:
时间复杂度:O(n),其中n为链表结点数,一共两次遍历,unordered_map每次计数、每次查询都是O(1)
空间复杂度:O(n),最坏情况下n个结点都不相同,哈希表长度为n

class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead) {
       if(pHead == nullptr) return nullptr; // 空链表
        unordered_map<int,int> mp;
        ListNode* pre = pHead;
        while(pre != nullptr){ //遍历链表统计每个节点值出现的次数
            mp[pre->val]++;
            pre = pre->next;
        }
        ListNode tmp = ListNode(-1);    //定义一个哑节点
        tmp.next = pHead;               //在链表前加一个表头
        pre = &tmp;
        while(pre->next != nullptr){		//再次循环链表
            if(mp[pre->next->val] != 1){  	//判断节点值计数是否为1  
                pre->next = pre->next->next; //用跳过的方式达到删除的效果
            }
            else{
                pre = pre->next;
            }
        }
        return tmp.next;//去掉表头
    }
};

运行时间:3ms
超过35.11% 用C++提交的代码
占用内存:540KB
超过24.49%用C++提交的代码

方法二:直接比较删除

具体做法:

  1. 其实在遍历链表的时候也可以直接删除,因为这是一个升序链表,重复的结点都连在一起。
  2. 同样给链表前加上表头,然后遍历,如果遇到了两个相邻结点相同,则新开内循环将这一段所有的相同都遍历过去,第一个相同前的结点直接连上第一个不相同值的结点。
  3. 返回时依然要去掉表头。

复杂度分析:
时间复杂度:O(n),其中n为链表结点数,只有一次遍历
空间复杂度:O(1),只开辟了临时指针,没有额外空间

class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead) {
        if(pHead == nullptr) return nullptr; //判空
        ListNode tmp = ListNode(-1);//哑节点
        tmp.next = pHead;//在链表前加一个表头
        ListNode* pre = &tmp;
        while(pre->next != nullptr && pre->next->next != nullptr){
            if(pre->next->val == pre->next->next->val){//遇到相邻两个结点值相同
                int value = pre->next->val;
                while(pre->next != nullptr && pre->next->val == value){//将所有相同的都跳过
                    pre->next = pre->next->next;
                }
            }
            else{
                    pre = pre->next;
            }  
        }
         return tmp.next;//返回时去掉表头
    }
};

运行时间:7ms
超过1.06% 用C++提交的代码
占用内存:532KB
超过25.72%用C++提交的代码

方法三:递归删除

class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead) {
        if (pHead==NULL)
            return NULL;
        if (pHead!=NULL && pHead->next==NULL)
            return pHead;
        
        ListNode* current;

        if (pHead->next->val==pHead->val){
            current=pHead->next->next;
            while (current != NULL && current->val==pHead->val)
                current=current->next;
            return deleteDuplication(current);
        }
 
        else {
            current=pHead->next;
            pHead->next=deleteDuplication(current);
            return pHead;
        }   
    }
};

运行时间:4ms
超过9.71% 用C++提交的代码
占用内存:588KB
超过16.81%用C++提交的代码

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-01 23:38:43  更:2022-04-01 23:42:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 9:53:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码