【链表】Leetcode 82. 删除排序链表中的重复元素 II【中等】

2024-05-28 14:04

本文主要是介绍【链表】Leetcode 82. 删除排序链表中的重复元素 II【中等】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

删除排序链表中的重复元素 II

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

示例 1:

在这里插入图片描述
输入:head = [1,2,3,3,4,4,5]
输出:[1,2,5]

解题思路

由于链表是已排序的,所以重复的节点会相邻出现。可以使用双指针法来解决这个问题,一个指针用于遍历链表,另一个指针用于跟踪上一个未重复的节点。

  • 遍历链表:使用两个指针pre和current。pre用于指向上一个未重复的节点,current用于遍历链表。
  • 删除重复节点:如果current和current.next的值相等,则继续向前遍历直到遇到不同的值为止。将pre.next指向当前遇到的第一个不同值节点。
  • 移动指针:如果current和current.next的值不同,pre移动到current位置,current继续向前遍历。
  • 返回结果:返回哨兵节点的下一个节点。

Java实现

public class DeleteDuplicates {public static class ListNode {int val;ListNode next;ListNode(int x) { val = x; }}public ListNode deleteDuplicates(ListNode head) {// 创建哨兵节点ListNode dummy = new ListNode(0);dummy.next = head;ListNode pre = dummy;ListNode current = head;while (current != null) {// 跳过当前节点后面所有的重复节点while (current.next != null && current.val == current.next.val) {current = current.next;}// 如果pre的下一个节点是current,说明当前节点没有重复if (pre.next == current) {pre = pre.next;} else {// 如果pre的下一个节点不是current,说明有重复节点,跳过所有重复节点pre.next = current.next;}current = current.next;}return dummy.next;}public static void main(String[] args) {DeleteDuplicates deleteDuplicates = new DeleteDuplicates();// 创建示例链表 1->2->3->3->4->4->5ListNode head = new ListNode(1);head.next = new ListNode(2);head.next.next = new ListNode(3);head.next.next.next = new ListNode(3);head.next.next.next.next = new ListNode(4);head.next.next.next.next.next = new ListNode(4);head.next.next.next.next.next.next = new ListNode(5);// 删除重复节点ListNode newHead = deleteDuplicates.deleteDuplicates(head);printList(newHead); // 输出: 1->2->5}// 辅助方法:打印链表public static void printList(ListNode head) {ListNode current = head;while (current != null) {System.out.print(current.val);if (current.next != null) {System.out.print("->");}current = current.next;}System.out.println();}
}

时间空间复杂度

  • 时间复杂度:O(n),其中 n 是链表的节点数。需遍历链表一次。
  • 空间复杂度:O(1),只使用了几个额外的指针。

这篇关于【链表】Leetcode 82. 删除排序链表中的重复元素 II【中等】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1010774

相关文章

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语

MySQL中查找重复值的实现

《MySQL中查找重复值的实现》查找重复值是一项常见需求,比如在数据清理、数据分析、数据质量检查等场景下,我们常常需要找出表中某列或多列的重复值,具有一定的参考价值,感兴趣的可以了解一下... 目录技术背景实现步骤方法一:使用GROUP BY和HAVING子句方法二:仅返回重复值方法三:返回完整记录方法四:

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

一文详解Git中分支本地和远程删除的方法

《一文详解Git中分支本地和远程删除的方法》在使用Git进行版本控制的过程中,我们会创建多个分支来进行不同功能的开发,这就容易涉及到如何正确地删除本地分支和远程分支,下面我们就来看看相关的实现方法吧... 目录技术背景实现步骤删除本地分支删除远程www.chinasem.cn分支同步删除信息到其他机器示例步骤

python删除xml中的w:ascii属性的步骤

《python删除xml中的w:ascii属性的步骤》使用xml.etree.ElementTree删除WordXML中w:ascii属性,需注册命名空间并定位rFonts元素,通过del操作删除属... 可以使用python的XML.etree.ElementTree模块通过以下步骤删除XML中的w:as

Navicat数据表的数据添加,删除及使用sql完成数据的添加过程

《Navicat数据表的数据添加,删除及使用sql完成数据的添加过程》:本文主要介绍Navicat数据表的数据添加,删除及使用sql完成数据的添加过程,具有很好的参考价值,希望对大家有所帮助,如有... 目录Navicat数据表数据添加,删除及使用sql完成数据添加选中操作的表则出现如下界面,查看左下角从左

C++链表的虚拟头节点实现细节及注意事项

《C++链表的虚拟头节点实现细节及注意事项》虚拟头节点是链表操作中极为实用的设计技巧,它通过在链表真实头部前添加一个特殊节点,有效简化边界条件处理,:本文主要介绍C++链表的虚拟头节点实现细节及注... 目录C++链表虚拟头节点(Dummy Head)一、虚拟头节点的本质与核心作用1. 定义2. 核心价值二

XML重复查询一条Sql语句的解决方法

《XML重复查询一条Sql语句的解决方法》文章分析了XML重复查询与日志失效问题,指出因DTO缺少@Data注解导致日志无法格式化、空指针风险及参数穿透,进而引发性能灾难,解决方案为在Controll... 目录一、核心问题:从SQL重复执行到日志失效二、根因剖析:DTO断裂引发的级联故障三、解决方案:修复

一文详解Java Stream的sorted自定义排序

《一文详解JavaStream的sorted自定义排序》Javastream中的sorted方法是用于对流中的元素进行排序的方法,它可以接受一个comparator参数,用于指定排序规则,sorte... 目录一、sorted 操作的基础原理二、自定义排序的实现方式1. Comparator 接口的 Lam

python3如何找到字典的下标index、获取list中指定元素的位置索引

《python3如何找到字典的下标index、获取list中指定元素的位置索引》:本文主要介绍python3如何找到字典的下标index、获取list中指定元素的位置索引问题,具有很好的参考价值,... 目录enumerate()找到字典的下标 index获取list中指定元素的位置索引总结enumerat