首页 > 试题广场 >

删除链表中重复的结点

[编程题]删除链表中重复的结点
  • 热度指数:804619 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表 1->2->3->3->4->4->5  处理后为 1->2->5

数据范围:链表长度满足 ,链表中的值满足

进阶:空间复杂度 ,时间复杂度

例如输入{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}

说明:本题目包含复杂数据结构ListNode,点此查看相关信息
头像 牛客题解官
发表于 2020-06-01 14:47:46
精华题解 题目的主要信息: 在一个非降序的链表中,存在重复的节点,删除该链表中重复的节点 重复的节点一个元素也不保留 举一反三: 学习完本题的思路你可以解决如下题目: JZ18. 删除链表的节点 方法一:直接比较删除(推荐使用) 思路: 这是一个升序链表,重复的节点都连在一起,我们就可以很轻易地比较到重复 展开全文
头像 宫水三叶的刷题日记
发表于 2021-07-01 17:07:13
精华题解 迭代解法 首先一个比较「直观且通用」的思路是,采用「边遍历边构造」的方式: 建一个「虚拟头节点」dummy 以减少边界判断,往后的答案链表会接在 dummy 后面; 使用 tail 代表当前有效链表的结尾; 通过原输入的 pHead 指针进行链表扫描。 对原链表进行遍历,只要原链表尚未到达结尾, 展开全文
头像 Maokt
发表于 2021-07-08 16:20:41
精华题解 算法思想一:递归 解题思路: 主要利用递归算法对有序链表递归遍历删除重复的节点 1、特殊情况,如果 pHead 为空,那么肯定没有值出现重复的节点,直接返回 pHead ;如果 pHead.next 为空,那么说明链表中只有一个节点,也没有值出现重复的节点,也直接返回 p 展开全文
头像 江南好___
发表于 2021-07-06 15:29:06
精华题解 描述 题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 示例 输入:{1,2,3,3,4,4,5} 返回值:{1,2, 展开全文
头像 牛客786963925号
发表于 2021-07-11 23:48:42
精华题解 解法一:虚拟结点 此题要求删除「所有的」重复结点,而存在「原链表头结点出现重复」这种情况。因此,为了实现方便,定义虚拟结点dummy,其next指针指向原头结点。 思路如图所示。 定义指针p,用以遍历链表;定义指针tail,用以指向当前「无重复链表」表尾; 每次p指针向前移动,并比较「当前位置 展开全文
头像 叫我皮卡丘
发表于 2019-09-15 11:04:46
删除链表中重复的结点 -- Java实现 1. 辅助空间 1. 分析 多次遍历,第一次遍历把重复的结点值存入 set 容器,第二次遍历,当结点值存储在 set 容器中,就删除该结点 2. 代码 import java.util.*; public class Solution { publi 展开全文
头像 中工升达预备毕业生
发表于 2019-09-11 21:03:25
说实话这题看着简单,真的不简单啊,尤其是它是一个链表,不是数组,指向这指向那,晕死掉了...真的写不出来啊! // 递归写法,比较容易理解,但当链表基本无重复节点时,效率不高。 public class Solution { public ListNode deleteDuplication 展开全文
头像 常喝水
发表于 2019-12-10 14:44:38
类似于leetcode83题,但是比那个难一点。这道题是不保留重复节点,而leetcode83保留。leetcode链接https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list/ leetcode:给定一个排序链表,删除 展开全文
头像 Oh~Sunny
发表于 2020-02-20 11:23:57
参考自剑指offer官方题解:具体的解释直接看代码就可看懂啦!!! class Solution: def deleteDuplication(self, pHead): # write code here # 判断链表是否为空 if not 展开全文
头像 一袋米要扛二楼
发表于 2019-11-25 23:56:15
这道题目看起来很简单,但是实际操作起来并不容易,尤其需要考虑头结点重复修改头结点这里说一下思路:直接声明一个ListNode **p = pHead用于修改结点p最初指向头结点,当头结点重复时可以通过*p直接修改头结点 不重复时可以通过p = &(xxx)修改其指向的结点 class Sol 展开全文
头像 hairrrrr
发表于 2020-03-25 23:19:42
public class Solution { public ListNode deleteDuplication(ListNode pHead) { // 如果链表首结点为空 或 链表只有一个结点直接返回这个表头 if(pHead == null | 展开全文
头像 fightinggold
发表于 2020-05-17 01:13:04
提供一种比较简单的解法,大致思路:链表是排序的,根据val值不同可把链表分为一个个小区间,每个小区间的第一个元素设定为锚点(anchor),那么如果把那些只出现一次的锚点重新连接成为链表就得到了最终结果。 public ListNode deleteDuplication(ListNode pHea 展开全文
头像 牛客61589415号
发表于 2021-10-01 11:06:56
/*function ListNode(x){ this.val = x; this.next = null; }*/ function deleteDuplication(pHead) { // write code here if(!pHead) { 展开全文
头像 designeer
发表于 2021-11-02 13:54:56
迭代解法 首先一个比较「直观且通用」的思路是,采用「边遍历边构造」的方式: 建一个「虚拟头节点」dummy 以减少边界判断,往后的答案链表会接在 dummy 后面; 使用 tail 代表当前有效链表的结尾; 展开全文
头像 Python_zhang
发表于 2022-03-01 08:35:12
/** * struct ListNode { * int val; * struct ListNode *next; * }; * * C语言声明定义全局变量请加上static,防止重复定义 */ /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 展开全文