LeetCode 82 删除排序链表中的重复元素-ii

75 阅读1分钟

参加了 kkb 的门徒培训,想要记录下自己的成长过程。每天一篇,坚持不断更 --- 2022.3.11

题目描述

给定一个已排序的链表的头 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
  • 题目数据保证链表已经按升序 排列

解题思路

这一个不断查找需要跳过点并跳过的过程。

/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var deleteDuplicates = function (head) {
  // 判断 head 是否为空
  if (!head || !head.next) return head;

  // 由于 头节点可能被删除
  let hair = new ListNode(-1, head),
    p = hair,
    q;

  while (p.next) {
    // 判断需要跳过的点
    if (p.next.next && p.next.val === p.next.next.val) {
      q = p.next.next;

      // 找到 与 p 下个节点不同的值
      while (q && q.val === p.next.val) {
        q = q.next;
      }
      // 使其挂载到 p 的下一个节点
      p.next = q;
    } else {
      p = p.next;
    }
  }

  return hair.next;
};