☆打卡算法☆LeetCode 82、删除排序链表中的重复元素 II 算法解析

举报
恬静的小魔龙 发表于 2022/03/02 09:08:02 2022/03/02
【摘要】 推荐阅读CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客QQ群:1040082875大家好,我是小魔龙,Unity3D软件工程师,VR、AR,虚拟仿真方向,不定时更新软件开发技巧,生活感悟,觉得有用记得一键三连哦。 一、题目 1、算法题目“给定一个升序的链表,删除链表中重复的节点,返回升序排列的结果链表。”题目链接:来源:力扣(LeetCode)链接:82. 删除排...

推荐阅读

大家好,我是小魔龙,Unity3D软件工程师,VR、AR,虚拟仿真方向,不定时更新软件开发技巧,生活感悟,觉得有用记得一键三连哦。

一、题目

1、算法题目

“给定一个升序的链表,删除链表中重复的节点,返回升序排列的结果链表。”

题目链接:

来源:力扣(LeetCode)

链接:82. 删除排序链表中的重复元素 II - 力扣(LeetCode) (leetcode-cn.com)

2、题目描述

存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。

返回同样按升序排列的结果链表。

image.png

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

二、解题

1、思路分析

利用有序链表的特点,重复节点出现的位置一定也是连续的。

那么就可以一次循环,删除重复的节点,由于头节点可能被删除,所以需要先保存头节点。

从头节点开始判断:

  • cur.val == cur.next.val,记录出现重复的节点,往后移动,直到不再相同或为空节点结束,将记录的节点删除
  • cur.val != cur.next.val,说明对应元素不相同,将cur指向cur.next

2、代码实现

代码参考:

class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        if (head == null) {
            return 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 x = cur.next.val;
                while (cur.next != null && cur.next.val == x) {
                    cur.next = cur.next.next;
                }
            } else {
                cur = cur.next;
            }
        }

        return dummy.next;
    }
}

image.png

3、时间复杂度

时间复杂度 : O(n)

其中n是数组的长度

空间复杂度: O(1)

只需要常量级的变量空间即可。

三、总结

对于链表或者树的问题,一般可以使用递归或迭代两种写法,本题就使用了递归。

递归的题目,最重要的是要清楚递归函数的定义和递归终止条件。

这道题的递归定义就是删除以头节点开头的链表中重复的节点。

那么递归终止条件就是如果cur为空,那么肯定没有重复的节点,直接返回cur。

如果cur.next为空,那么说明链表中只有一个节点,也没有出现重复的节点,直接返回cur。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。