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

143 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天,点击查看活动详情

先来看看83. 删除排序链表中的重复元素 - 力扣(LeetCode) (leetcode-cn.com)

LeedCode 83:删除排序链表中的重复元素

题目描述

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

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

解题思路

思路一:遍历

删除节点方法curr.next = curr.next.next

/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var deleteDuplicates = function (head) {
  let curr = head;
  while (curr !== null && curr.next !== null) {
    if (curr.val === curr.next.val) {
      curr.next = curr.next.next;
    } else {
      curr = curr.next;
    }
  }
  return head;
};

时间复杂度: O(n);

空间复杂度: O(1);

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

题目描述

存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。

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

解题思路

该题与上一题的区别在于需多遍历一次删除重复元素

思路一:遍历

额外使用一个dummy node(哑节点)指向链表的头节点,

指针 cur 指向链表的哑节点,随后开始对链表进行遍历。如果当前 cur.nextcur.next.next 对应的元素相同,那么我们就需要将 cur.next 以及所有后面拥有相同元素值的链表节点全部删除。我们记下这个元素值 x,随后不断将 cur.next 从链表中移除,直到 cur.next 为空节点或者其元素值不等于 x 为止。此时,我们将链表中所有元素值为 x 的节点全部删除。

如果当前cur.nextcur.next.next 对应的元素不相同,那么说明链表中只有一个元素值为 cur.next 的节点,那么我们就可以将 cur 指向 cur.next

当遍历完整个链表之后,我们返回链表的的哑节点的下一个节点 dummy.next 即可。

/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var deleteDuplicates = function (head) {
  let dummy = new ListNode(0, head);
  dummy.next = head;
  let cur = dummy;
  // 边界判断
  while (cur.next && cur.next.next) {
    if (cur.next.val === cur.next.next.val) {
      let x = cur.next.val;
      // 将 cur.next 以及所有后面拥有相同元素值的链表节点全部删除
      while (cur.next && cur.next.val === x) {
        cur.next = cur.next.next;
      }
    } else {
      cur = cur.next;
    }
  }
  return dummy.next;
};

时间复杂度: O(n);

空间复杂度: O(1);

参考资料

82. 删除排序链表中的重复元素 II - 力扣(LeetCode) (leetcode-cn.com)