剑指offer——JZ76 删除链表中重复的结点 解题思路与具体代码【C++】

news2024/10/7 20:35:48

一、题目描述与要求

删除链表中重复的结点_牛客题霸_牛客网 (nowcoder.com)

题目描述

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表 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}


二、解题思路

思路①【利用无序容器哈希表】时间O(n) 空间O(n)

首先我们需要找到重复结点,因此我们可以利用无序容器unordered_map来统计每个结点出现的次数。统计完之后,我们只需要在遍历每个结点的时候查看其出现的次数是否等于1即可知道它是不是重复结点,是的话直接将结点删去即可。

此时如果我们只利用pHead指针显然是无法实现个别结点的删除,比如第一个结点。因而我们可以添加一个空的头结点在第一个结点前面,并且令p指向它,而后就是对p->next进行判断即可,这样所有结点都会被判断到。最后只需要返回L->next即可。

思路②【将相邻的两个结点依次进行比较】 时间O(n) 空间O(1)

还是需要定义一个空的头结点,然后从第一个结点开始遍历链表,将两个相邻的结点依次进行比较,如果两个结点的值相等,则获取重复的值,并且把后面所有重复的结点都删除直至没有重复,直至遍历完整个链表,最后返回L->next。


三、具体代码

思路①

#include <unordered_map>
class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead) {
        if(pHead==nullptr) return nullptr; //空链表返回空指针
        unordered_map<int, int> map;//利用哈希表计算每个结点出现的次数
        ListNode*p=pHead;//用于遍历链表
        while(p){
            map[p->val]++;
            p=p->next;
        }
        ListNode* L=new ListNode(0);//添加一个空的头结点 为了从第一个结点开始判断
        L->next=pHead;//将空头结点与第一个结点连接起来
        p=L;//从头开始遍历链表
        while(p->next){ //第一个结点开始
            //只要这个结点出现的次数大于1次 重复的结点会重复进行删除
            if(map[p->next->val]!=1){ 
                p->next=p->next->next; //删去这个结点
            }
            else {
                p=p->next; //否则的话访问下一个结点
            }
        }
        return L->next;
    }
};

思路②

#include <unordered_map>
class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead) {
        if(pHead==nullptr) return nullptr; //空链表返回空指针
        ListNode* L=new ListNode(0);//添加一个空的头结点 为了从第一个结点开始判断
        L->next=pHead;//将空头结点与第一个结点连接起来
        ListNode *p=L;//从头开始遍历链表
        while(p->next&&p->next->next){ //对两个相邻的结点进行判断
            if(p->next->val==p->next->next->val){ //相邻两个结点相等 即为重复结点
                int temp=p->next->val;//获取当前重复结点的值
                while(p->next&&p->next->val==temp){//将相同的结点都删除
                    p->next=p->next->next; //删掉重复结点
                }
            }
            else {
                p=p->next;
            }
        }
        return L->next;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1062062.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1802_在Linux系统上开发ARM单机片机嵌入式软件

全部学习汇总&#xff1a; GreyZhang/little_bits_of_linux: My notes on the trip of learning linux. (github.com) 1. 在Linux上也有嵌入式的开发环境&#xff0c;或许还有很多。不过&#xff0c;我现在接触到的大部分还是Windows居多。这一份文件介绍的是一个mbed platform…

springcloudAlibaba之Nacos服务注册源码分析

Nacos服务注册源码分析 Nacos服务注册原理Nacos服务注册怎么做的Nacos服务注册源码解读 带着以上三个问题&#xff0c;进入到今天的源码解读 问题1:Nacos服务注册原理 Nacos首先从bootstrap.yml配置文件中读取我们配置好的nacos配置&#xff0c;这里面一般包括spring.applic…

亚马逊,速卖通,国际站卖家如何找到真实干净的买家账号测评补单

对于卖家而言&#xff0c;测评资源确实是一项宝贵的财富。通过自养号和广告相结合的策略&#xff0c;可以快速有效地提升产品销量、增加转化率以及提高Listing的权重。这是一个很好的方法来优化产品在平台上的表现 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&…

小谈设计模式(18)—适配器模式

小谈设计模式&#xff08;18&#xff09;—适配器模式 专栏介绍专栏地址专栏介绍 适配器模式角色分析目标接口&#xff08;Target&#xff09;源接口&#xff08;Adaptee&#xff09;适配器&#xff08;Adapter&#xff09; 核心思想应用场景Java程序实现输出结果程序分析123 优…

【Python】基于OpenCV人脸追踪、手势识别控制的求生之路FPS游戏操作

【Python】基于OpenCV人脸追踪、手势识别控制的求生之路FPS游戏操作 文章目录 手势识别人脸追踪键盘控制整体代码附录&#xff1a;列表的赋值类型和py打包列表赋值BUG复现代码改进优化总结 py打包 视频&#xff1a; 基于OpenCV人脸追踪、手势识别控制的求实之路FPS游戏操作 手…

两文学会scala (下)|保姆级别教程(超详细)

上文内容概括&#xff1a; Scala 概述与安装、变量、运算符、流程控制、函数式编程、面向对象 上文链接&#xff1a;两文学会scala &#xff08;上&#xff09;&#xff5c;保姆级别教程&#xff08;超详细&#xff09;_超爱慢的博客-CSDN博客 目录 第7章 集合 7.1 集合简介…

增强负样本提高CPI表现

确定CPI对药物发现至关重要。由于实验验证CPI通常是耗时和昂贵的&#xff0c;计算方法有望促进这一过程。可用CPI数据库的快速增长加速了许多用于CPI预测的机器学习方法发展。然而&#xff0c;它们的性能&#xff0c;特别是它们对外部数据的泛化性&#xff0c;经常受到数据不平…

根据您的数据量定制的ChatGPT,改变客户服务的方式

在当今竞争激烈的商业环境中&#xff0c;提供优质的客户服务对于保持忠诚的客户群和推动业务增长至关重要。客户满意度已成为各行各企业的首要任务&#xff0c;因为它直接影响客户留存和品牌声誉。随着技术的进步&#xff0c;公司不断探索创新解决方案&#xff0c;以增强客户服…

Mac 挂载 Alist网盘

挂载服务器的Alist 网盘到 Mac mac,使用的是 CloundMounter 这个软件进行挂载 http://ip:port/dav/ 需要在末尾加上 /dav/ 在一些服务器上&#xff0c;为了提供WebDAV服务&#xff0c;需要在URL地址的末尾添加"/dav/“。这是因为WebDAV协议规定了一些标准的URL路径&#x…

1024 科学计数法

一.问题&#xff1a; 科学计数法是科学家用来表示很大或很小的数字的一种方便的方法&#xff0c;其满足正则表达式 [-][1-9].[0-9]E[-][0-9]&#xff0c;即数字的整数部分只有 1 位&#xff0c;小数部分至少有 1 位&#xff0c;该数字及其指数部分的正负号即使对正数也必定明确…

SpringBoot的流浪宠物系统

采用技术:springbootvue 项目可以完美运行

数控车床中滚珠螺母的维护保养方法

滚珠螺母是一种高精度的机械部件&#xff0c;广泛应用于各种机械设备中&#xff0c;包括数控机床、精密轴承座、滚珠丝杆等&#xff0c;滚珠螺母作为数控机床中的进给系统的重要组件&#xff0c;其维护保养方法对于机床的精度和使用寿命具有重要影响。以下为数控机床滚珠螺母维…

1800_vim的宏录制功能尝试

全部学习信息汇总&#xff1a; GreyZhang/editors_skills: Summary for some common editor skills I used. (github.com) 最近5年多来&#xff0c;我emacs的编辑器用的还是比较多的。我的配置基本上是一个spacemacs&#xff0c;然后根据自己的需求增加了一丁点儿的其他配置。而…

数据结构基本概念-Java常用算法

数据结构基本概念-Java常用算法 1、数据结构基本概念2、数据逻辑结构3、算法时间复杂度 1、数据结构基本概念 数据&#xff08;Data&#xff09;&#xff1a;数据是信息的载体&#xff0c;其能够被计算机识别、存储和加工处理&#xff0c;是计算机程序加工的“原材料”。数据元…

C++stackqueue

目录 一、stack 1.1 简要介绍 1.2 小试身手 1.3 模拟实现 二、queue 2.1 简要介绍 2.2 小试身手 2.3 模拟实现 三、deque 3.1 简要介绍 3.2 分析底层 四、priority_queue 4.1 简要介绍 4.2 小试身手 4.3 模拟实现 五、仿函数/函数对象 5.1 简要介绍 一…

全网最全Python系列教程(非常详细)---Python中文乱码讲解(学Python入门必收藏)

&#x1f9e1;&#x1f9e1;&#x1f9e1;这篇是关于Python中为什么会出现中文乱码的讲解&#xff0c;欢迎点赞和收藏&#xff0c;你点赞和收藏是我更新的动力&#x1f9e1;&#x1f9e1;&#x1f9e1; 在解释Python中中文乱码的问题之前&#xff0c;我们先对计算机中几个基本…

物联网AI MicroPython传感器学习 之 手指侦测心跳传感器

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; 一、产品简介 手指侦测心跳传感器是通过LED和光电晶体管监测手指血压脉冲&#xff0c;来判断人的心脏跳动。其结构简单成本低廉&#xff0c;只能是做一些实验和学习相关的知识&#xff08;没有医疗实用价值&…

C++11新特性(语法糖,新容器)

距离C11版本发布已经过去那么多年了&#xff0c;为什么还称为新特性呢&#xff1f;因为笔者前面探讨的内容&#xff0c;除了auto&#xff0c;范围for这些常用的&#xff0c;基本上是用着C98的内容&#xff0c;虽说C11已经发布很多年&#xff0c;却是目前被使用最广泛的版本。因…

string类的模拟实现(万字讲解超详细)

目录 前言 1.命名空间的使用 2.string的成员变量 3.构造函数 4.析构函数 5.拷贝构造 5.1 swap交换函数的实现 6.赋值运算符重载 7.迭代器部分 8.数据容量控制 8.1 size和capacity 8.2 empty 9.数据修改部分 9.1 push_back 9.2 append添加字符串 9.3 运算符重载…

Nacos与Eureka的区别

大家好我是苏麟今天说一说Nacos与Eureka的区别. Nacos Nacos的服务实例分为两种l类型&#xff1a; 临时实例&#xff1a;如果实例宕机超过一定时间&#xff0c;会从服务列表剔除&#xff0c;默认的类型。非临时实例&#xff1a;如果实例宕机&#xff0c;不会从服务列表剔除&…