leetcode刷题82. 删除排序链表中的重复元素 II,Medium(Java)递归+迭代

LeetCode算法82删除排序链表中的重复元素 II解析 给定一个排序链表删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。 示例 1: 输入: 1->2->3->3->4->4->5 输出: 1->2->5 示例 2: 输入: 1->1->1->2->3 输出: 2->3 这个主要是需要在出现重复时,将前一个不重复数的节点的next指向重复数字之后,... 阅读详情

1.题目描述

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

示例 1:
示例1

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

示例 2:
示例2

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

提示:

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

2.解法

tips:链表看不懂可以画图。

2.1 递归

2.1.1 思路

递归的三要素

  • 明确函数的功能
  • 递归的结束条件
  • 函数的等价关系

1.函数的功能是删除重复节点
2.递归的结束条件为到了链表的最后节点
3.函数的等价关系head.next = self.deleteDuplicates(head.next)

2.1.2 Java代码

class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        if(head == null||head.next == null){
            return head;
        }
        if(head.val != head.next.val){
            head.next = deleteDuplicates(head.next);
        }
        else{
            ListNode cur = head.next;
            while(cur!=null&&head.val == cur.val){
                cur = cur.next;
            }
            return deleteDuplicates(cur);
        }
        return head;
    }
}

2.2 迭代

2.2.1 思路

时间复杂度 O(n^2)
首先因为需要返回链表头,所以新建一个节点称为dummy(哑节点)保存头节点,用于返回。
之后因为需要删光所有的重复节点,所以需要首先保存重复节点前的节点cur。
先保存这个重复节点的值,通过cur.next和值比较相同就删除。

2.2.2 Java

class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        ListNode dummy = new ListNode(0,head);
        ListNode cur = dummy;
        while(cur.next!=null&&cur.next.next!=null){
            if(cur.next.val ==cur.next.next.val){
                int value = cur.next.val;
                while(cur.next!=null&&cur.next.val==value){
                    cur.next = cur.next.next;
                }
            }
            else{
                cur = cur.next;
            }
        }
        return dummy.next;
    }
}
用树莓派Pico低成本更新USB-C PD控制器固件实战指南 固件更新是嵌入式系统开发与维护中的核心环节,它直接决定了硬件设备的功能、性能与兼容性。其原理通常是通过特定的通信接口(如SWD、JTAG、UART或USB)与设备内部的Bootloader建立连接,将新的程序代码安全写入非易失性存储器。在USB Power Delivery(PD)和Type-C生态中,固件更新技术尤为重要,它能修复协议握手Bug、适配新设备并提升供电策略的灵活性。本文聚焦于一个典型的工程实践场景:如何利用广泛普及且成本极低的树莓派Pico开发板,作为USB-C协议到I²C协议的转换桥,实现 阅读详情

相关推荐

【数据结构与算法】之深入解析“删除排序链表中的重复元素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; 目数据保证链表已经按升序排列。 二、求解算法 ① 递归 递归

╰つ栺尖篴夢ゞ 1102

LeetCode-82-删除排序链表中的重复元素 II-C语言

/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ typedef struct ListNode Node; /* 方法一:重新构造一个新的List */ struct ListNode* deleteDup...

SFFS 494

编程实践:寒武纪-LLM&VLM模型量化&部署

本文介绍了在MLU370-S4平台上对大模型(LLM/VLM)进行量化的两种方法:SmoothQuant和WeightOnly。以Qwen2-VL-2B模型为例,详细说明了两种量化方式的命令行参数配置,包括必须设置的per_channel选项和量化参数调整建议。量化完成后,提供了模型部署的具体命令示例,包含设备分配、端口设置、并行度等关键参数。文章强调在MLU370芯片上需要手动设置block_size,并指出两种量化方式只能二选一使用。配套资料已上传至百度网盘供参考。

微风❤水墨 472

LeetCode笔记 82. 删除排序链表中的重复元素 II

82. 删除排序链表中的重复元素 II目要求递归迭代目要求 给定一个排序链表删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。 示例 1: 输入: 1->2->3->3->4->4->5 输出: 1->2->5 示例 2: 输入: 1->1->1->2->3 输出: 2->3 ...

g534441921的博客 258

leetcode删除排序链表中的重复元素 II(java递归和非递归)

给定一个排序链表删除所有含有重复数字的节点,只保留原始链表中没有重复出现的数字。 示例1: 输入: 1->2->3->3->4->4->5 输出: 1->2->5 示例2: 输入: 1->1->1->2->3 输出: 2->3 非递归自己做的发现很差虽然过了 public ListNo...

pioneer的博客 441

82. Remove Duplicates from Sorted List II删除排序链表中的重复元素 II)两种解法(C++ & 注释)

82. 删除排序链表中的重复元素 II1. 目描述2. 迭代(Iteration)2.1 解思路2.2 实例代码3. 递归(Recursion)3.1 解思路3.2 实例代码4. 参考资料 1. 目描述 给定一个排序链表删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。 示例 1: 输入: 1->2->3->3->4->4->5 输出: 1->2->5 示例 2: 输入: 1->1->1->2->3 输

主要研究图形学相关领域 392

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

#!/usr/bin/python3 # -*- coding: utf-8 -*- # @Time: 2019/3/23 # @Author: xfLi # The file... """ 问分析: (1)当遇到重复的节点,循环next到最后一个重复节点 (2)对重复节点做标记 """ class ListNode: def __init__(self, x): ...

晓峰博客笔记 641

LeetCode-82. 删除排序链表中的重复元素 II-Java-medium

LeetCode-82. 删除排序链表中的重复元素 II-Java-medium

qq_41829337的博客 165

leetCode40-45 解代码,调试代码和思路

本文属于特定的六道解和调试代码。1 ✔ [70]爬楼梯 Easy 2023-03-24 1072 ✔ [148]排序链表 Medium 2022-12-13 1063 ✔ [82]删除排序链表中的重复元素 II Medium 2023-03-18 1054 ✔ [31]下一个排列 Medium 2023-02-15 1055 ✔ [1143]最长公共子序列 Medium 2023-03-23 1046 ✔ [2]两数相加 Medium 2023-03-22 102。

心比天高,仗剑走天涯,保持热爱,奔赴向梦想! 826

leetcode82. 删除排序链表中的重复元素 IIjava

/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode deleteDupl...

奔跑的小白 1574

LeetCode82. 删除排序链表中的重复元素 II————中等

目录目解思路1Code运行结果解思路2Code运行结果 82. 删除排序链表中的重复元素 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 &

Kinght_123的博客 644

82. 删除排序链表中的重复元素 II迭代

LeetCode82. 删除排序链表中的重复元素 II 如果头节点会出现改动的,建议创建一个没用的带头结点, 方便 理清思路还是 AC Code /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } *

lankerens 328

力扣(合并区间)

给定一组可能重叠或相邻的整数区间,合并所有重叠或端点相接的区间,返回不重叠的最小区间列表。例如输入 [[1,3],[2,6],[8,10],[15,18]],输出 [[1,6],[8,10],[15,18]]。核心是先按左端点升序排序,再单次线性扫描完成合并,避免暴力两两比较。

weixin_52811458的博客 299

LeetCode 155. 最小栈|Python 解法详解

这道的关键是:使用主栈保存数据,辅助栈在每一层同步保存“截至当前位置的最小值”。理解这一点后,再结合边界条件检查,代码就能保持清晰且稳定。

a1250467048的博客 236

LeetCode 1. 两数之和 | 从暴力枚举到哈希表最优解 + 空间换时间思想全复盘

文章摘要 目要求在数组中找到两数之和等于目标值的下标。核心思路是优化查找效率: 暴力法:双重循环枚举所有数对,时间复杂度O(),效率低但易实现。 哈希表优化:利用哈希表O(1)查找特性,遍历时存储已访问元素,每次计算差值并查询,时间复杂度降至O(n)。关键细节是先查后存,避免自匹配。 代码实现:哈希表法通过一次遍历完成,空间换时间,边界处理需注意空数组和不足两元素的情况。 常见错误:内层循环起始点、哈希表键值设计、立即返回结果等易错点需警惕。 面试要点:优先选择哈希表解法,解释与暴力法的差异,强调时间

yc2284238579的博客 256

LeetCode //MySQL - 1204. Last Person to Fit in the Bus

This SQL query solves the problem of finding the last person who can board a bus without exceeding the 1000 kg weight limit. The solution involves: Calculating a running total of weights ordered by boarding turn using a window function Filtering to only in

Made in Code 368

leetcode】153. 寻找旋转排序数组中的最小值js

本文介绍了在旋转排序数组中寻找最小值的二分查找算法。通过比较中间元素与数组末尾元素,可以确定最小值所在区间:若中间值大于末尾值,则最小值在右侧;否则在左侧或当前位置。文章提供了两种实现方式,第一种通过样例总结返回nums[l],第二种采用更标准的二分写法,确保循环结束时left==right。两种方法时间复杂度均为O(logn),适用于解决LeetCode相关目。关键点在于利用旋转数组的特性缩小搜索范围。

2402_83244812的博客 150

LeetCode //C - 1203. Sort Items by Groups Respecting Dependencies

This problem involves sorting items with group constraints and dependency relations. The key steps are: Assign unique groups to items with no group (-1) Build dependency graphs for both items and groups Perform topological sorting on both graphs If both so

Made in Code 374

LeetCode hot100——最大子数组和

给你一个整数数组nums,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。是数组中的一个连续部分。6连续子数组 [4,-1,2,1] 的和最大,为 6。nums = [1]123如果你已经实现复杂度为O(n)的解法,尝试使用更为精妙的求解。

weixin_42927227的博客 212

10.LeetCode算法习讲解--滑动窗口--最大连续为一的个数

利用滑动窗口解决最大连续1的个数

Jammy_1的博客 220

tdm64-gcc-4.9.2.exe

官网下载的资源,官网很难登进去,这里是压缩exe的压缩包

上一篇: 哈希表(HashMap)的概念以及Java使用
下一篇: leetcode刷题 1. 两数之和(Java)Easy 暴力+哈希
Sueko
博客等级 码龄9年 47粉丝 · 67原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值