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

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

题目描述:

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

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

LeedCode 82:删除排序链表中的重复元素 II_第1张图片

链接:

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

解题思路

思路一:遍历

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

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

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

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

/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var deleteDuplicates = function (head) {
  var dummy = new ListNode(0, head);
  dummy.next = head;
  var cur = dummy;
  // 边界判断
  while (cur.next && cur.next.next) {
    if (cur.next.val === cur.next.next.val) {
      const 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)

你可能感兴趣的:(LeedCode,链表,leetcode,删除排序链表中的重复元素,II)