力扣-82. 删除排序链表中的重复元素

news/2024/10/14 4:27:12

1.题目

题目地址(82. 删除排序链表中的重复元素 II - 力扣(LeetCode))

https://leetcode.cn/problems/remove-duplicates-from-sorted-list-ii/

题目描述

给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。

 

示例 1:

输入:head = [1,2,3,3,4,4,5]
输出:[1,2,5]

示例 2:

输入:head = [1,1,1,2,3]
输出:[2,3]

 

提示:

  • 链表中节点数目在范围 [0, 300]
  • -100 <= Node.val <= 100
  • 题目数据保证链表已经按升序 排列

2.题解

2.1 一次遍历

思路

1.首先注意是否需要处理空链表情况? 这里 *cur = head, cur != nullptr 即可以避免空链表的情况
2.是否需要虚拟头结点?是,因为可能出现需要删除链表头部元素的可能
3.需要几个节点?首先要一个prev保存上一个非重复元素位置; 其次我们需要一个cur用来表示当前位置, 可能还需要一个临时节点tempy用于更新链表(便于删除)
4.对于出现重复值和没有出现重复值的处理是不一样的,我们需要进行不同的处理:
4.1对于没有出现重复值的话,我们直接将prev和cur都往后移动即可
4.2对于出现重复值的情况,我们保持prev不动,向后移动cur(同时删除当前cur节点)直到:

  • 1.cur的值和下一个值不同为止;
  • 2.没有下一个值了 cur->next == nullptr;
    到这时,我们发现会剩下最后一个重复节点有删除,进行单独处理,同时更新prev的值
  1. 终止条件
  • 1.删节点删的 cur == nullptr, 比如像[1,2,5,5,5], 最后的几个节点均是重复节点,删除之后 cur == nullptr
  • 2.前一步是正常后移, prev = cur, cur = cur->next; 但是没有下一个值了,不存在重复节点的问题,直接结束

代码

  • 语言支持:C++
    C++ Code:
class Solution {
public:ListNode* deleteDuplicates(ListNode* head) {ListNode* dummyHead = new ListNode(0, head);ListNode *prev = dummyHead, *cur = head;// 首先保证cur != nullptr, 才可能有cur->next, 不然会报错访问空指针while (cur != nullptr && cur->next != nullptr) {if (cur->val == cur->next->val) {// 处理重复节点(后面一个指针不为nullptr,才有可能存在重复节点问题)while (cur->next != nullptr && cur->val == cur->next->val) {ListNode* temp = cur;cur = cur->next;delete temp;}// 处理最后一个重复节点ListNode* temp = cur;cur = cur->next;prev->next = cur; // 更新prev->nextdelete temp;} else {prev = cur;cur = cur->next;}}return dummyHead->next;}
};

复杂度分析

令 n 为数组长度。

  • 时间复杂度:\(O(n)\)
  • 空间复杂度:\(O(1)\)

总结

这题最麻烦的是弄清楚究竟什么时候终止,有哪些可能的情况,尤其是我们讨论 cur->next这种下一个节点的时候,要考虑到有没有可能当前节点cur就是空指针了

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

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

相关文章

联考物理T24

Solution — T24 题目描述 (本PDF为 JJL 所制)如图所示,一厚壁玻璃容器放在水平面桌面上,容器底内底面积为 $50\ cm^2 $,外底面积为 $100 \ cm^2 $。将一定质量的水倒入容器中,水的深度为 \(10 \ cm\) 。求:\((p_水=1.0 \times 10^3 kg/m^3 , g \text{取} 10 N/kg)\)(1) 水对…

物理解题

Solution — T24 题目描述 (本PDF为 JJL 所制)如图所示,一厚壁玻璃容器放在水平面桌面上,容器底内底面积为 $50\ cm^2 $,外底面积为 $100 \ cm^2 $。将一定质量的水倒入容器中,水的深度为 \(10 \ cm\) 。求:\((p_水=1.0 \times 10^3 kg/m^3 , g \text{取} 10 N/kg)\)(1) 水对…

2024-05-01:用go语言,给定两个长度为偶数n的整数数组nums1和nums2, 分别移除它们各自的一半元素, 将剩下的元素合并成集合s。 找出集合s中可能包含的最多元素数量。 输入:nums

2024-05-01:用go语言,给定两个长度为偶数n的整数数组nums1和nums2, 分别移除它们各自的一半元素, 将剩下的元素合并成集合s。 找出集合s中可能包含的最多元素数量。 输入:nums1 = [1,2,3,4,5,6], nums2 = [2,3,2,3,2,3]。 输出:5。 答案2024-05-01: chatgpt 题目来自lee…

nestjs如何使用typeorm

默认你有点nestjs基础第一步安装npm add @nestjs/typeorm typeorm mysql2第二步 imports: [TypeOrmModule.forRoot({type:mysql,host:,port:3306,username:,password:,database:,entities:[User,User1],synchronize:true}), UsersModule, Users1Module],UsersModule是我加的模块…

强烈推荐,企业级消息推送神器:Austin,让沟通无处不在!

PDF格式公众号回复关键字:ZKCH002开源一个支持email,短信,语音,服务号,小程序,企业wx,钉钉,飞书,APP推送等消息类型的推送系统 随着企业数字化程度越来越高,不同的系统通过消息推送来增强业务流程的通信效率和协调性场景越来越多。以下是一些具体系统中使用到消息推送…

kubernetes的搭建(一)

集群的搭建 集群的类型kubunetes的集群类型大致上分为两类: 一主多从和多主多从。一主多从: 一台master节点和多台node节点,搭建简单,但是有单机故障的风险,适用于测试环境 多主多从: 多台master节点和多台node节点,搭建麻烦,安全性高,适用于生产环境为了测试简单,本…

.mat文件转换为png

将CFD(CrackForest Datasets)数据集的GroundTruth中的.mat文件转换为便于使用的maskpng将CFD(CrackForest Datasets)数据集的GroundTruth中的.mat文件转换为便于使用的maskpng dotmat2png.py import scipy.io import numpy as np import cv2 import osdef save_mask(mat_fi…

CF628F Bear and Fair Set

传送门网络流好题。 先将所有限制按 \(u_i\) 排序,同时令 \(u_0=0,t_0=0\) 和 \(u_{q+1}=b,t_{q+1}=n\)。(下面就把 \(q\leftarrow q+1\) 了) 这些限制会把 \(1\sim b\) 分成 \(q\) 段。先检查一遍,如果出现 \(u_i\) 更大反而 \(t_i\) 更小,unfair;如果出现一个段内数的个…