【路飞】82. 删除排序链表中的重复元素 II

194 阅读1分钟

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

题目描述:

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

提示:

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

思路:

  1. 为了防止头节点就是重复数字的节点这种临界问题,需要设置虚拟节点p。
  2. 设一个q指针,作用是指向不重复数字的节点,将p的next指向q。
  3. 比较两个节点的数字:
    • 重复时q指向重复的第2个节点,与p.next(此时p.next是重复数字的节点)进行比较,若重复q向后移,直到不重复节点,将p.next指向q,即将重复的节点都跳过。
    • 不重复时,p向后移一位,重复步骤3。

步骤3示意图:

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

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var deleteDuplicates = function(head) {
    if(head == null || head.next == null) return head;

    var node = new ListNode(-1);
    node.next = head;
    var p = node, q;

    while(p.next != null) {
        if(p.next.next && p.next.next.val == p.next.val) {
            q = p.next.next;
            while(q && q.val == p.next.val) q = q.next;
            p.next = q;
        }else {
            p = p.next;
        }
    }
    return node.next;
};