2832 字
约 9 分钟
15
083.删除排序链表中的重复元素
无标签

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

作者:沉默王二
发布时间:2023-09-29T08:53:07.681+0800


本题解同时收录在星球专栏《二哥的 LeetCode 刷题笔记》中,专栏托管在语雀平台上(更方便你沉浸式阅读和做笔记),访问地址和密码:https://t.zsxq.com/6iuzn6I

题意

给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。

难度

简单

示例

示例1:

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

示例2:

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

分析

注意,本题跟 082.删除排序链表中的重复元素 II 很像,差别就是本题只需要保留一个重复的元素,而 082 需要把所有重复的元素全部删除。

既然很像,那我们就可以采用同样的解题思路。

  • 从链表头部 head 开始遍历整个链表。
  • 检查当前节点(cur)和下一个节点(cur.next )的值。如果它们相同,则跳过下一个节点(即删除 cur.next 节点)。通过 cur.next = cur.next.next 来实现。
  • 如果当前节点和下一个节点的值不同,则移动 cur 到下一个节点。

来看题解。

/**

 * public class ListNode { *     int val; *     ListNode next; *     ListNode() {} *     ListNode(int val) { this.val = val; } *     ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */class Solution {    public ListNode deleteDuplicates(ListNode head) {        // 如果链表为空或只有一个节点,直接返回        if (head == null){            return null;        }
        // 初始化cur指针,从头结点开始        ListNode cur = head;
        // 遍历链表,直到cur或cur.next为null        while (cur.next != null) {            // 检查当前节点的值和下一个节点的值是否相同            if (cur.val == cur.next.val) {                // 如果相同,删除下一个节点(通过跳过下一个节点来实现)                cur.next = cur.next.next;            } else {                // 如果不同,将cur移动到下一个节点                cur = cur.next;            }        }
        // 返回修改后的链表的头结点        return head;    }}

我们来模拟一下整个过程。假设已排序的链表为: 1 -> 1 -> 2 -> 3 -> 3

初始化cur指向头节点。

[cur]1 -> 1 -> 2 -> 3 -> 3

首先,检查cur和cur.next 。它们的值都是 1,所以我们删除cur.next 节点:

[cur]1 -> 2 -> 3 -> 3

然后,cur指向的值(1)和其下一个节点的值(2)不相同。所以,移动cur到下一个节点:

1 -> [cur]2 -> 3 -> 3

再次,cur指向的值(2)和其下一个节点的值(3)不相同。所以,移动cur到下一个节点:

1 -> 2 -> [cur]3 -> 3

现在,cur和cur.next 的值都是 3,所以我们删除cur.next 节点:

1 -> 2 -> [cur]3

此时,cur.next 为空,停止循环。

最终链表为: 1 -> 2 -> 3

那这次我们不需要用到虚拟节点 grandFather 了,因为我们的题解必然会把第一个元素保留下来,无论它重不重复。

来看一下题解的效率:

总结

本题大致与 082.删除排序链表中的重复元素 II 一致,所不同的是,需要留下一个重复元素,这是一道非常简单的链表题目,相信大家都能解出来。

力扣链接:https://leetcode.cn/problems/remove-duplicates-from-sorted-list/

一步一个脚印

不积跬步无以至千里,不积小流无以成江海。LeetCode - 100天从算法小白到卷王正式启动了,我们计划周一到周五至少每天更新一篇,周六周日更新一篇,目标 300 道 LeetCode 经典题。

PDF 版本目前只针对**二哥编程星球 的球友开放,如果你也想一起打卡学习算法的话,戳链接 **加入我们吧。

一个人可以走得很快,但一群人才能走得更远。二哥编程星球 (目前已有 3500 多名球友加入)里面的每个球友都非常的友善,除了鼓励你,还会给你提出合理的建议,一起冲!

本题解同时收录在星球专栏《二哥的 LeetCode 刷题笔记》中,专栏托管在语雀平台上(更方便你沉浸式阅读和做笔记),访问地址和密码:https://t.zsxq.com/6iuzn6I

题意

给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。

难度

简单

示例

示例1:

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

示例2:

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

分析

注意,本题跟 082.删除排序链表中的重复元素 II 很像,差别就是本题只需要保留一个重复的元素,而 082 需要把所有重复的元素全部删除。

既然很像,那我们就可以采用同样的解题思路。

  • 从链表头部 head 开始遍历整个链表。
  • 检查当前节点(cur)和下一个节点(cur.next )的值。如果它们相同,则跳过下一个节点(即删除 cur.next 节点)。通过 cur.next = cur.next.next 来实现。
  • 如果当前节点和下一个节点的值不同,则移动 cur 到下一个节点。

来看题解。

/**

 * public class ListNode { *     int val; *     ListNode next; *     ListNode() {} *     ListNode(int val) { this.val = val; } *     ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */class Solution {    public ListNode deleteDuplicates(ListNode head) {        // 如果链表为空或只有一个节点,直接返回        if (head == null){            return null;        }
        // 初始化cur指针,从头结点开始        ListNode cur = head;
        // 遍历链表,直到cur或cur.next为null        while (cur.next != null) {            // 检查当前节点的值和下一个节点的值是否相同            if (cur.val == cur.next.val) {                // 如果相同,删除下一个节点(通过跳过下一个节点来实现)                cur.next = cur.next.next;            } else {                // 如果不同,将cur移动到下一个节点                cur = cur.next;            }        }
        // 返回修改后的链表的头结点        return head;    }}

我们来模拟一下整个过程。假设已排序的链表为: 1 -> 1 -> 2 -> 3 -> 3

初始化cur指向头节点。

[cur]1 -> 1 -> 2 -> 3 -> 3

首先,检查cur和cur.next 。它们的值都是 1,所以我们删除cur.next 节点:

[cur]1 -> 2 -> 3 -> 3

然后,cur指向的值(1)和其下一个节点的值(2)不相同。所以,移动cur到下一个节点:

1 -> [cur]2 -> 3 -> 3

再次,cur指向的值(2)和其下一个节点的值(3)不相同。所以,移动cur到下一个节点:

1 -> 2 -> [cur]3 -> 3

现在,cur和cur.next 的值都是 3,所以我们删除cur.next 节点:

1 -> 2 -> [cur]3

此时,cur.next 为空,停止循环。

最终链表为: 1 -> 2 -> 3

那这次我们不需要用到虚拟节点 grandFather 了,因为我们的题解必然会把第一个元素保留下来,无论它重不重复。

来看一下题解的效率:

总结

本题大致与 082.删除排序链表中的重复元素 II 一致,所不同的是,需要留下一个重复元素,这是一道非常简单的链表题目,相信大家都能解出来。

力扣链接:https://leetcode.cn/problems/remove-duplicates-from-sorted-list/

一步一个脚印

不积跬步无以至千里,不积小流无以成江海。LeetCode - 100天从算法小白到卷王正式启动了,我们计划周一到周五至少每天更新一篇,周六周日更新一篇,目标 300 道 LeetCode 经典题。

PDF 版本目前只针对**二哥编程星球 的球友开放,如果你也想一起打卡学习算法的话,戳链接 **加入我们吧。

一个人可以走得很快,但一群人才能走得更远。二哥编程星球 (目前已有 3500 多名球友加入)里面的每个球友都非常的友善,除了鼓励你,还会给你提出合理的建议,一起冲!

本题解同时收录在星球专栏《二哥的 LeetCode 刷题笔记》中,专栏托管在语雀平台上(更方便你沉浸式阅读和做笔记),访问地址和密码:https://t.zsxq.com/6iuzn6I

题意

给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。

难度

简单

示例

示例1:

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

示例2:

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

分析

注意,本题跟 082.删除排序链表中的重复元素 II 很像,差别就是本题只需要保留一个重复的元素,而 082 需要把所有重复的元素全部删除。

既然很像,那我们就可以采用同样的解题思路。

  • 从链表头部 head 开始遍历整个链表。
  • 检查当前节点(cur)和下一个节点(cur.next )的值。如果它们相同,则跳过下一个节点(即删除 cur.next 节点)。通过 cur.next = cur.next.next 来实现。
  • 如果当前节点和下一个节点的值不同,则移动 cur 到下一个节点。

来看题解。

/**

 * public class ListNode { *     int val; *     ListNode next; *     ListNode() {} *     ListNode(int val) { this.val = val; } *     ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */class Solution {    public ListNode deleteDuplicates(ListNode head) {        // 如果链表为空或只有一个节点,直接返回        if (head == null){            return null;        }
        // 初始化cur指针,从头结点开始        ListNode cur = head;
        // 遍历链表,直到cur或cur.next为null        while (cur.next != null) {            // 检查当前节点的值和下一个节点的值是否相同            if (cur.val == cur.next.val) {                // 如果相同,删除下一个节点(通过跳过下一个节点来实现)                cur.next = cur.next.next;            } else {                // 如果不同,将cur移动到下一个节点                cur = cur.next;            }        }
        // 返回修改后的链表的头结点        return head;    }}

我们来模拟一下整个过程。假设已排序的链表为: 1 -> 1 -> 2 -> 3 -> 3

初始化cur指向头节点。

[cur]1 -> 1 -> 2 -> 3 -> 3

首先,检查cur和cur.next 。它们的值都是 1,所以我们删除cur.next 节点:

[cur]1 -> 2 -> 3 -> 3

然后,cur指向的值(1)和其下一个节点的值(2)不相同。所以,移动cur到下一个节点:

1 -> [cur]2 -> 3 -> 3

再次,cur指向的值(2)和其下一个节点的值(3)不相同。所以,移动cur到下一个节点:

1 -> 2 -> [cur]3 -> 3

现在,cur和cur.next 的值都是 3,所以我们删除cur.next 节点:

1 -> 2 -> [cur]3

此时,cur.next 为空,停止循环。

最终链表为: 1 -> 2 -> 3

那这次我们不需要用到虚拟节点 grandFather 了,因为我们的题解必然会把第一个元素保留下来,无论它重不重复。

来看一下题解的效率:

总结

本题大致与 082.删除排序链表中的重复元素 II 一致,所不同的是,需要留下一个重复元素,这是一道非常简单的链表题目,相信大家都能解出来。

力扣链接:https://leetcode.cn/problems/remove-duplicates-from-sorted-list/

一步一个脚印

不积跬步无以至千里,不积小流无以成江海。LeetCode - 100天从算法小白到卷王正式启动了,我们计划周一到周五至少每天更新一篇,周六周日更新一篇,目标 300 道 LeetCode 经典题。

PDF 版本目前只针对**二哥编程星球 的球友开放,如果你也想一起打卡学习算法的话,戳链接 **加入我们吧。

一个人可以走得很快,但一群人才能走得更远。二哥编程星球 (目前已有 3500 多名球友加入)里面的每个球友都非常的友善,除了鼓励你,还会给你提出合理的建议,一起冲!

            知识星球
            
    
    
        
        扫码加入星球
        查看更多优质内容
    
    https://wx.zsxq.com/mweb/views/joingroup/join_group.html?group_id=15522885221412
083.删除排序链表中的重复元素
https://clxhxhhr.top/posts/2537/
作者
clxstart
发布于
2026-09-19
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。