力扣83删除排序链表中的重复元素:代码实现+思路分析+方法总结(快慢指针法&递归)

简介: 力扣83删除排序链表中的重复元素:代码实现+思路分析+方法总结(快慢指针法&递归)

第一部分:题目描述

🏠 链接:83. 删除排序链表中的重复元素 - 力扣(LeetCode)

⭐ 难度:简单

第二部分:代码实现

2.1 快慢指针法

步骤:

  1. 当节点数小于2时,则不会发生重复节点的情况,无需删除,直接返回。
  2. 设置快慢指针,慢指针指向头节点head,快指针指向 head 的下一个节点。
  3. 使用fast指针遍历链表,每次对 fast.val 与 slow.val 进行比较。
  • 快慢指针的val值相等,说明当前链表中还存与当前slow指向节点的值相等的节点。不需要理会当前fast指向的节点,直接向后移动一位。当 fast和last的val值不相等的时候,将slow的下一个节点设置为fast即可达到跳过重复节点的效果。
  • 快慢指针的val值不相等,说明不再存在与当前slow指向的值相等的其他节点。设置 slow 的下一个节点为当前 fast 指向的节点来达到跳过重复节点的效果,slow后移,fast后移。
  1. fast 已遍历完链表,为null,slow 也应该指向 null,以跳过 slow 与 fast 之间的节点(肯定是重复节点)。
  2. 返回头节点。
class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        // 当节点数小于2时,则不会发生重复节点的情况,无需删除,直接返回
        if (head == null || head.next == null) {
            return head;
        }
        // 慢指针
        ListNode slow = head;
        // 快指针,初始指向 head 的下一个节点
        ListNode fast = head.next;
        // fast 遍历链表,fast == null 说明遍历完成
        while (fast != null) {
            if (slow.val == fast.val) {
                // 情况一:快慢指针的val值相等,说明当前链表中还存与当前slow指向节点的值相等的节点
                // 不需要理会当前fast指向的节点,直接向后移动一位
                // 当 fast和last的val值不相等的时候,将slow的下一个节点设置为fast即可达到跳过重复节点的效果
                fast = fast.next;
            } else {
                // 情况二:快慢指针的val值不相等,说明不再存在与当前slow指向的值相等的其他节点
                // 2.1 设置 slow 的下一个节点为当前 fast 指向的节点
                slow.next = fast;
                // 2.2 slow 向后移动
                slow = slow.next;
                // 2.3 fast 向后移动
                fast = fast.next;
            }
        }
        // fast 已遍历完链表,为null,slow 也应该指向空
        // 例如链表:1 -> 1 -> 3 -> 3 -> null
        // fast为null时,slow 为第一个3,则需要跳过第二个3,那么 slow 指向 null 或者 fast 即可 
        slow.next = null;
        // 返回头节点
        return head;
    }
}

2.2 递归

递归函数负责返回:从当前节点(我)开始,完成去重的链表

  1. 若我与 next 重复,返回 next
  2. 若我与 next 不重复,返回我,但 next 应当更新
deleteDuplicates(ListNode p=1) {
    deleteDuplicates(ListNode p=1) {
        1.next=deleteDuplicates(ListNode p=2) {
            2.next=deleteDuplicates(ListNode p=3) {
                deleteDuplicates(ListNode p=3) {
          // 只剩一个节点,返回
                    return 3
                }                
            }
            return 2
        }
        return 1
    }
}

代码:

class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        // 如果无节点或到了最后一个节点,则返回 null 或 最后一个节点即可
        if (head == null || head.next == null) {
            return head;
        }
        if (head.val == head.next.val) {
            // 如果当前节点的val与下一个节点的val相等
            // 则返回下一个节点,就是不保留当前节点,只保留下一个节点
            return deleteDuplicates(head.next);
        } else {
            // 如果当前节点的val与下一个节点的val不相等
            // 则更新当前节点的next
            head.next = deleteDuplicates(head.next);
            // 返回当前节点
            return head;
        }
    }
}


相关文章
|
7月前
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
76 1
|
6月前
|
算法 索引
单链表题+数组题(快慢指针和左右指针)
单链表题+数组题(快慢指针和左右指针)
74 1
|
7月前
|
算法
【链表】算法题(二) ----- 力扣/牛客
【链表】算法题(二) ----- 力扣/牛客
|
7月前
|
索引
力扣(LeetCode)数据结构练习题(3)------链表
力扣(LeetCode)数据结构练习题(3)------链表
164 0
|
7月前
|
算法
【链表】算法题(一) ----- 力扣 / 牛客
【链表】算法题(一) ----- 力扣 / 牛客
|
8月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
113 6
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
9月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
97 6
|
9月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
199 2
|
6月前
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
162 1
|
8月前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
103 3
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口