leetcode #82. 删除排序链表中的重复元素 II

42 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天,点击查看活动详情

删除排序链表中的重复元素 II

题目

82. 删除排序链表中的重复元素 II

难度中等

给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。 示例 1:

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

示例 2:

输入: head = [1,1,1,2,3]
输出: [2,3]

提示:

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

分析

题目的意思很简单,将链表中那些是重复元素的元素去掉。需要注意的是它是排序链表,也意味着重复元素是连续的

这和链表去重大不相同,链表去重是将保证链表没有重复的元素,也就是遇到重复元素,我们只保留一个元素,但本题是全部删除,而本体的排序数组让我们能用更简单的方法来解决,而不是去重的使用栈或set来解决。

解法

理清题目后我们很轻易就能想到我们需要做什么,遇到p.val=p.next.val时将后续所有val=p.val的元素删除即可。注意p节点也需要删除。

代码如下

function deleteDuplicates(head: ListNode | null): ListNode | null {
  let root = new ListNode(0, head);
  // 依旧是新建头节点链表,也方便我们删除第一个重复节点
  let p = root;
  while (p?.next && p?.next?.next) {
    // 我们选择p.next和p.next.next来比较,这样我们只需要一个指针来进行跳过节点操作。
    if (p?.next.val === p.next.next.val) {
      let q = p?.next.val;
      while (p?.next?.val === q) {
        // p=p.next.next,跳过所有val=p.next.val的元素,也包括p.next
        p.next = p?.next.next;
      }
    } else {
      p = p?.next as ListNode;
      // 直至没有遇到重复元素才往下走
    }
  }
  return root.next;
}

总结

本次文章的难点在于理清题目的意思,看明白题目做起来很简单,没仔细看很可能就会浪费很多时间,就像我刚开始没看好题目就开写,结果走了弯路。

结语

本次的文章到这里就结束啦!♥♥♥读者大大们认为写的不错的话点个赞再走哦 ♥♥♥

每天一个知识点,每天都在进步!♥♥