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

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

一、题目


1、算法题目

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

题目链接:

来源:力扣(LeetCode)

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


2、题目描述

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

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

网络异常,图片无法展示
|

示例 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;
    }
}
复制代码

网络异常,图片无法展示
|


3、时间复杂度

时间复杂度 : O(n)

其中n是数组的长度

空间复杂度: O(1)

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


三、总结

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

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

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

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

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



相关文章
|
29天前
|
机器学习/深度学习 存储 算法
如何评判算法好坏?复杂度深度解析
如何评判算法好坏?复杂度深度解析
24 0
|
1月前
|
机器学习/深度学习 算法 PyTorch
RPN(Region Proposal Networks)候选区域网络算法解析(附PyTorch代码)
RPN(Region Proposal Networks)候选区域网络算法解析(附PyTorch代码)
232 1
|
1月前
|
缓存 算法 C语言
【C++ 标准查找算法 】C++标准库查找算法深入解析(In-depth Analysis of C++ Standard Library Search Algorithms)
【C++ 标准查找算法 】C++标准库查找算法深入解析(In-depth Analysis of C++ Standard Library Search Algorithms)
46 0
|
2天前
[leetcode~dfs]1261. 在受污染的二叉树中查找元素
[leetcode~dfs]1261. 在受污染的二叉树中查找元素
[leetcode~dfs]1261. 在受污染的二叉树中查找元素
|
7天前
|
算法
代码随想录算法训练营第五十七天 | LeetCode 739. 每日温度、496. 下一个更大元素 I
代码随想录算法训练营第五十七天 | LeetCode 739. 每日温度、496. 下一个更大元素 I
12 3
|
11天前
|
算法
【力扣】169. 多数元素
【力扣】169. 多数元素
|
18天前
|
存储 缓存 算法
深度解析JVM世界:垃圾判断和垃圾回收算法
深度解析JVM世界:垃圾判断和垃圾回收算法
|
19天前
|
存储 算法
【算法与数据结构】深入解析二叉树(二)之堆结构实现
【算法与数据结构】深入解析二叉树(二)之堆结构实现
|
23天前
|
存储 算法
从动态规划到贪心算法:最长递增子序列问题的方法全解析
从动态规划到贪心算法:最长递增子序列问题的方法全解析
21 2
|
1月前
|
存储 缓存 算法
C++链表解析:从基础原理到高级应用,全面掌握链表的使用
C++链表解析:从基础原理到高级应用,全面掌握链表的使用
51 0

推荐镜像

更多