leetcode刷题(剑指offer) 82.删除排序链表中的重复元素Ⅱ

82.删除排序链表中的重复元素Ⅱ

给定一个已排序的链表的头 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
  • 题目数据保证链表已经按升序 排列

题解

本题要求是在一个有序链表中,把重复的节点都删除,由于是有序的,因此重复的节点都是相邻的。可以使用递归和迭代两种方法去解决。下面分别介绍这两种方法,正常链表题好像都是有这两种方法。

  1. 递归法

首先,我们需要明确三个点,递归函数的作用是什么,递归函数的出口是什么,我们能解决什么小问题,然后将后续的逻辑交给递归函数。写递归逻辑的时候,在函数中调用递归函数本身的时候,将他当成已经实现的函数来使用。

  • ListNode deleteDuplicates(ListNode head)的作用是,将从head节点开始,将后面所有重复的节点都删除,并返回头节点
  • 递归函数的出口:那必然是当head为空,或者head的下一个是空(链表只有一个节点,必不可能重复)。直接返回头节点
  • 我们能解决的小问题:我们只需要解决第一个head及其后面连续节点的删除工作即可。这里会涉及到两种情况。
    • head和它后面的节点不重复:这种情况,我们就不需要删除任何节点,直接将head.next交给递归函数处理即可
    • head和它后面的节点重复:这种情况,我们需要删除head为首的及其后续所有值等于head的节点,随后找到第一个不重复的节点,以这个节点作为链表头交给递归函数进行处理。

看如下案例:

对于链表1 -> 2 -> 2 -> 2 -> 3 -> 4的重复节点删除

上述案例在2节点的时候,将三个连续的2节点删除,然后再将后续节点送入到deleteDuplicates中继续删除,将这个结果,作为上一层deleteDuplicates的结果返回给head的next。

代码实现如下

package com.offer;

import com.offer.leetcode.datastruct.ListNode;
import com.offer.leetcode.datastruct.ListNodeUtils;

import java.util.List;

public class _82删除排序链表中的重复元素Ⅱ {

    public static void main(String[] args) {
        int[] arr = new int[]{1, 1, 1, 1, 2, 3, 4, 5, 6, 6, 6, 6, 7, 8, 9, 10, 10, 10};
        ListNode list = ListNodeUtils.createList(arr);
        ListNodeUtils.printListNode(list);
        ListNode header = deleteDuplicates(list);
        ListNodeUtils.printListNode(header);
    }

    public static ListNode deleteDuplicates(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        // 只处理链表的头,剩下的交给递归
        if (head.val != head.next.val) {
            // 因为没有重复,所以不删除头节点
            head.next = deleteDuplicates(head.next);
            return head;
        }else {
            // 头节点出现重复了,找到不同的
            ListNode noDup = head.next;
            while (noDup != null && noDup.val == head.val) {
                noDup = noDup.next;
            }
            return deleteDuplicates(noDup);
        }
    }

}

  1. 迭代法

迭代法同理,这里需要了解的一个小技巧是,因为在这道题中head是会发生变化的,因此可以创建一个dummy节点,让它的下一个指向head节点,最后返回dummy的下一个即可,这样即使后续的head被删了,我们最后返回的头节点的写法还是不会变化的。

代码实现如下:

package com.offer;

import com.offer.leetcode.datastruct.ListNode;
import com.offer.leetcode.datastruct.ListNodeUtils;

import java.util.List;

public class _82删除排序链表中的重复元素Ⅱ {

    public static void main(String[] args) {
        int[] arr = new int[]{1, 1, 1, 1, 2, 3, 4, 5, 6, 6, 6, 6, 7, 8, 9, 10, 10, 10};
        ListNode list = ListNodeUtils.createList(arr);
        ListNodeUtils.printListNode(list);
        ListNode header = deleteDuplicates(list);
        ListNodeUtils.printListNode(header);
    }

    /**
     * 迭代法求解
     * @param head 头节点
     * @return
     */
    public static ListNode deleteDuplicates(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        // 因为在这个题里面头节点可能会发生变动,因此需要重新创建出一个虚拟的头节点
        ListNode dummy = new ListNode(0);
        dummy.next = head;
        ListNode pre = dummy;
        ListNode noDup = head;
        while (noDup != null) {
            // 跳到下一个不重复的,
            while (noDup.next != null && noDup.val == noDup.next.val) {
                noDup = noDup.next;
            }
            if (pre.next == noDup) {
                // 进入到这里说明没有重复节点
                pre = pre.next;
            }else {
                // 如果有重复节点
                pre.next = noDup.next;
            }
            noDup = noDup.next;
        }

        return dummy.next;
    }

}

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

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

相关文章

数据监测的频次应如何设定

品牌在做控价时&#xff0c;需要先对线上数据进行监测&#xff0c;监测就要考虑监测的时间点&#xff0c;是白天监测还是夜晚监测&#xff0c;或者一天要监测几轮&#xff0c;这些问题都需要提前考虑好&#xff0c;因为待监测结果出来还要做破价治理&#xff0c;所以时间结点必…

PyCharm安装教程(超详细),零基础小白也能看懂

一、简介 PyCharm是一款Python IDE&#xff0c;其带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具&#xff0c;比如&#xff0c; 调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制等等。此外&#xff0c;该IDE提供了一些高级功…

DAIL-SQL:LLM在Text-to-SQL任务中的详细评估

导语 本文聚焦于利用LLMs进行Text-to-SQL任务&#xff0c;并指出缺乏系统性基准测试限制了有效、高效和经济的LLM-based Text-to-SQL解决方案的发展。研究者首先系统地比较了现有的提示工程方法&#xff0c;并分析了它们的优缺点。基于这些发现&#xff0c;提出了一个新的综合…

高等数学基础【1】极限与连续

第一节 函数 一、基本概念 ①函数 设变量x的取值范围为D,若对任意的x∈D,按照某种对应关系总有唯一确定的值y与x对应,称y为x的函数,记为yf(z),其中D称为函数yf(x)的定义域 ②复合函数 设uφ(x)(x∈D1),yf(u)(u∈D,),且对任意的x∈D1有φ(x)∈D2,称y为x的复合函数,记为yf[φ…

iText操作pdf

最近有个任务是动态的创建pdf根据获取到的内容&#xff0c;百度到的知识点都比较零散&#xff0c;官方文档想必大家也不容易看懂。下文是我做出的汇总 public class CreatePdfUtils {public static void create(){//准备File file new File("C:\\code\\base-project-back…

pytorch学习笔记(十二)

以下代码是以CIFAR10这个10分类的图片数据集训练过程的完整的代码。 训练部分 train.py主要包含以下几个部件&#xff1a; 准备训练、测试数据集用DateLoader加载两个数据集&#xff0c;要设置好batchsize创建网络模型&#xff08;具体模型在model.py中&#xff09;设置损失函…

【大数据】Flink SQL 语法篇(三):窗口聚合(TUMBLE、HOP、SESSION、CUMULATE)

Flink SQL 语法篇&#xff08;三&#xff09;&#xff1a;窗口聚合 1.滚动窗口&#xff08;TUMBLE&#xff09;1.1 Group Window Aggregation 方案&#xff08;支持 Batch / Streaming 任务&#xff09;1.2 Windowing TVF 方案&#xff08;1.13 只支持 Streaming 任务&#xff…

自己实现的小功能

小功能实现 2024/1/31 问题一&#xff1a; 将文本模式的csv文件作为表编辑之后&#xff0c;先要再变回来。找了5分钟都没找到&#xff0c;去网上搜也没搜到 解决方案 复制一份&#xff0c;对没错。 不是把表遍历一遍&#xff0c;重新将数据写入。 3.5给的答案就是重新写入…

网络防御基础介绍和基本的策略集

1.什么是防火墙 防火墙的主要职责在于&#xff1a;控制和防护 --- 安全策略 --- 防火墙可以根据安全策略来抓取流量之后做出对应的动作。 2.防火墙的分类 防火墙吞吐量 --- 防火墙同一时间处理的数据量 3.防火墙的历史 4.防火墙的分类 1.基于数据包的防火墙-包过滤防火墙 缺…

深度学习(9)--pydot库和graphviz库安装流程详解

目录 一.pydot库安装 二.graphviz库安装 一.pydot库安装 pydot的安装可直接在编译器安装相关包&#xff0c;以PyCharm举例&#xff1a; 如果搜索可用软件包显示为空&#xff0c;记得在此处把使用Conda软件包管理器”点亮 二.graphviz库安装 点击链接下载安装包graphviz-2.38…

网络协议与攻击模拟_11DHCP欺骗防护

开启DHCP 监听 ip dhcp snooping 指定监听vlan ip dhcp snooping vlan 1 由于开启监听后&#xff0c;交换机上的接口就全部变成非信任端口&#xff0c; 非信任端口会拒绝DHCP报文&#xff0c;会造成正常的DHCP请求和响应都无法完成。 现在是请求不到IP地址的&#xff0c;…

字符串匹配算法(BF、KMP)

一 字符串匹配算法—BF算法 BF算法简称暴力破解算法&#xff0c;时间复杂度很容易计算为O&#xff08;m*n&#xff09;(当n>>m时候) 本身字符串S&#xff0c;长度为m 模式字符串T,长度为n 最差情况&#xff0c;需要匹配(n-m)mm才可以成功&#xff0c;所以时间复杂度就是…

tarojs View多行文本无法换行问题解决

问题&#xff1a;未换行 code&#xff1a; 解决&#xff1a; 加上换行属性的css就好了 white-space: break-spaces;

银行ATM监控对讲系统分机可视对讲分机|ATM音视频终端IP网络可视对讲终端IP对讲终端对讲分机IP网络对讲系统

SV-6301T可视对讲终端 &#xff08;单键&#xff09; 产品简介 产品简介&#xff1a; 一键报警可视对讲终端是用于平安城市、银行、医院&#xff0c;智慧养老&#xff0c;景区&#xff0c;智慧路灯&#xff0c;平安校园&#xff0c;智慧电梯&#xff0c;无人超市等方案中的一…

哈希表算法模版

模拟散列哈希表 活动 - AcWing 拉链法 思路&#xff1a; 代码如下&#xff1a; #include <cstring> #include <iostream>using namespace std;const int N 1e5 3; // 取大于1e5的第一个质数&#xff0c;取质数冲突的概率最小 可以百度//* 开一个槽 h int h[…

jmeters响应结果反写csv文件及参数化

1.http响应结果反写csv文件 1.1各参数设置级别 线程组&#xff08;一级&#xff09;---->请求默认值、请求头、http请求、察看结果树&#xff08;二级&#xff09;----->正则表达式、BeanShell 后置处理程序&#xff08;三级&#xff09;。 1.2.正则表达式提取反写参数…

Backtrader 文档学习-Cheat-On-Open

Backtrader 文档学习-Cheat-On-Open 1.概述 V1.9.44.116增加了Cheat On Open的支持。对于全押的人来说&#xff0c;这似乎是一个必需的功能&#xff0c;用bar的收盘价后进行计算&#xff0c;希望与开盘价相匹配。 当开盘价差距&#xff08;上涨或下跌&#xff0c;取决于买入或…

SpringClound项目相关

nacos本机模式非虚拟机启动也可正常连接 nacos中的配置中心相当于在application.yml中的相关配置&#xff0c;转移位置&#xff0c;内容同application.yml完全一样均可。 黑马项目导入后&#xff0c;依赖缺失&#xff1a; 首先尝试maven重新加载&#xff0c;控制台提示传递依…

聊一聊GPT、文心、通义、混元

我使用同一个Prompt提示词“请以记叙文的文体来写”&#xff0c;分别发送给GPT-3.5&#xff08;调用API&#xff09;、文心、通义、混元&#xff0c;下面是它们各自生成的文本内容&#xff0c;大家一看便知了。 GPT-3.5&#xff1a; 在我个人使用GPT模型的过程中&#xff0c;我…

ESP32-C3 vscode USB-Serial-JTAG 调试

硬件 接线 查看驱动 vs code配置 debugging via builtin USB-JTAG 配置调试UART 配置下载类型 创建调试配置 调试 参考 esp32c3内置USB-Serial-JTAG的使用 链接: link 看了之后&#xff0c;还是不会ESP32-C3的调试及下载&#xff0c;你过来打我&#xff01;&#xff01;&…