[路飞]_leetcode-83-删除排序链表中的重复元素

简介: leetcode-83-删除排序链表中的重复元素

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


「这是我参与11月更文挑战的第22天,活动详情查看:2021最后一次更文挑战


[题目地址][B站视频]


存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次


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


示例 1:


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


输入: head = [1,1,2]
输出: [1,2]
复制代码


示例 2:


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


输入: head = [1,1,2,3,3]
输出: [1,2,3]
复制代码


提示:


  • 链表中节点数目在范围 [0, 300]
  • -100 <= Node.val <= 100
  • 题目数据保证链表已经按升序排列


本题要我们删除有序链表中的重复元素


也就是说当出现值相同的元素出现多次的情况,要把这些元素只保留一个


又因为题目给出的链表是有序的,所以值相同的元素一定是连在一起的


所以我们可以在遍历链表的过程中判断当前链表节点的值和它的下一个节点的值是否相同,如果相同,则删除下一个链表节点


如果后续链表节点的值依然相同,则继续删除,直到找到一个值不同的链表节点或者走到链表末尾 null


那在链表中,删除一个节点如何操作呢?


例如:有链表 1=>2=>3=>null,此时如果想要删除链表中 2 号节点,则只需要将链表中 1 号节点的 next 的指针指向 3 号节点,即可达到在该链表中删除 2 号节点的效果


有了以上基础,我们来看下本题如何求解


解题思路如下:


  1. 特殊判断当链表为空或者链表中只有一个节点的时候,此时肯定不会存在重复元素,直接返回原链表即可
  2. 定义一个指针 pre 初始化指向头节点 head, 另一个指针 next 指向 head.next
  3. next 指针不为空时,判断 next 指针指向节点的值是否和 pre 指针指向节点的值相同,如果相同,则说明两节点相同,next 指针向后走,直到找到一个节点,值和 pre 指针指向节点值不同
  4. pre.next 指向 next,达到删除中间重复元素的效果
  5. 两指针一起向后走,直到 next = null
  6. 返回头节点 head 即可


整体过程如下:


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


代码如下:


var deleteDuplicates = function(head) {
  // 如果是空链表或者只有一个节点,不会存在重复元素,直接返回
  if(head === null || head.next === null) return head;
  // 定义两个指针
  let pre = head,next = head.next;
  // 每次next向后找到和pre val值不同的元素,链接pre=>next
  while(next){
    while(next && next.val===pre.val) next = next.next;
    pre.next = next;
    pre = pre.next;
    next = next?next.next:null;
  }
  return head;
};
复制代码


至此我们就完成了 leetcode-83-删除排序链表中的重复元素


如有任何问题或建议,欢迎留言讨论!

相关文章
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
137 1
|
6月前
|
机器学习/深度学习 存储 算法
【LeetCode 热题100】347:前 K 个高频元素(详细解析)(Go语言版)
这篇文章详细解析了力扣热题 347——前 K 个高频元素的三种解法:哈希表+小顶堆、哈希表+快速排序和哈希表+桶排序。每种方法都附有清晰的思路讲解和 Go 语言代码实现。小顶堆方法时间复杂度为 O(n log k),适合处理大规模数据;快速排序方法时间复杂度为 O(n log n),适用于数据量较小的场景;桶排序方法在特定条件下能达到线性时间复杂度 O(n)。文章通过对比分析,帮助读者根据实际需求选择最优解法,并提供了完整的代码示例,是一篇非常实用的算法学习资料。
390 90
|
4月前
|
存储
203. 移除链表元素,707.设计链表,206. 反转链表
链表是数据结构中的重要概念,包含单链表、双链表和循环链表。单链表每个节点存储数据与下一节点指针;双链表增加上一节点指针;循环链表首尾相连。 **例题解析:** 1. **203. 移除链表元素**:通过遍历链表删除指定值节点,注意处理头节点特殊情况。 2. **707. 设计链表**:实现链表的增删查操作,需理解指针操作逻辑,避免直接修改目标节点。 3. **206. 反转链表**:采用双指针或递归方法改变节点指向,完成链表反转。 以上题目涵盖链表核心操作,掌握后可灵活应对相关问题。
|
6月前
|
算法 Go
【LeetCode 热题100】23:合并 K 个升序链表(详细解析)(Go语言版)
本文详细解析了 LeetCode 热题 23——合并 K 个升序链表的两种解法:优先队列(最小堆)和分治合并。题目要求将多个已排序链表合并为一个升序链表。最小堆方法通过维护节点优先级快速选择最小值,;分治合并则采用归并思想两两合并链表。文章提供了 Go 语言实现代码,并对比分析两种方法的适用场景,帮助读者深入理解链表操作与算法设计。
204 10
【LeetCode 27】347.前k个高频元素
【LeetCode 27】347.前k个高频元素
122 0
|
索引
Leetcode第三十三题(搜索旋转排序数组)
这篇文章介绍了解决LeetCode第33题“搜索旋转排序数组”的方法,该问题要求在旋转过的升序数组中找到给定目标值的索引,如果存在则返回索引,否则返回-1,文章提供了一个时间复杂度为O(logn)的二分搜索算法实现。
101 0
Leetcode第三十三题(搜索旋转排序数组)
|
索引
力扣(LeetCode)数据结构练习题(3)------链表
力扣(LeetCode)数据结构练习题(3)------链表
247 0
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
|
存储 SQL 算法
LeetCode 题目 86:分隔链表
LeetCode 题目 86:分隔链表
|
存储 算法 Java
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
147 2