[路飞]_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-删除排序链表中的重复元素


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

相关文章
|
2月前
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
40 1
|
2月前
【LeetCode 27】347.前k个高频元素
【LeetCode 27】347.前k个高频元素
41 0
|
2月前
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
29 0
LeetCode第二十四题(两两交换链表中的节点)
|
2月前
|
索引
力扣(LeetCode)数据结构练习题(3)------链表
力扣(LeetCode)数据结构练习题(3)------链表
101 0
|
7月前
【移除链表元素】LeetCode第203题讲解
【移除链表元素】LeetCode第203题讲解
|
6月前
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
|
6月前
|
存储 SQL 算法
LeetCode 题目 86:分隔链表
LeetCode 题目 86:分隔链表
|
6月前
|
存储 算法 Java
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
66 2
|
7月前
<数据结构>五道LeetCode链表题分析.环形链表,反转链表,合并链表,找中间节点.
<数据结构>五道LeetCode链表题分析.环形链表,反转链表,合并链表,找中间节点
70 1
|
6月前
|
算法
【经典LeetCode算法题目专栏分类】【第7期】快慢指针与链表
【经典LeetCode算法题目专栏分类】【第7期】快慢指针与链表