Skip to content

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

题目描述

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

 

示例 1:

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

示例 2:

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

 

提示:

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

方法一:一次遍历

我们先创建一个虚拟头节点 dummy,令 dummy.next=head,然后创建指针 pre 指向 dummy,指针 cur 指向 head,开始遍历链表。

cur 指向的节点值与 cur.next 指向的节点值相同时,我们就让 cur 不断向后移动,直到 cur 指向的节点值与 cur.next 指向的节点值不相同时,停止移动。此时,我们判断 pre.next 是否等于 cur,如果相等,说明 precur 之间没有重复节点,我们就让 pre 移动到 cur 的位置;否则,说明 precur 之间有重复节点,我们就让 pre.next 指向 cur.next。然后让 cur 继续向后移动。继续上述操作,直到 cur 为空,遍历结束。

最后,返回 dummy.next 即可。

时间复杂度 O(n),其中 n 为链表的长度。空间复杂度 O(1)

java
class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        ListNode dummy = new ListNode(0, head);
        ListNode pre = dummy;
        ListNode cur = head;
        while (cur != null) {
            while (cur.next != null && cur.next.val == cur.val) {
                cur = cur.next;
            }
            if (pre.next == cur) {
                pre = cur;
            } else {
                pre.next = cur.next;
            }
            cur = cur.next;
        }
        return dummy.next;
    }
}
cpp
class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        ListNode* dummy = new ListNode(0, head);
        ListNode* pre = dummy;
        ListNode* cur = head;
        while (cur) {
            while (cur->next && cur->next->val == cur->val) {
                cur = cur->next;
            }
            if (pre->next == cur) {
                pre = cur;
            } else {
                pre->next = cur->next;
            }
            cur = cur->next;
        }
        return dummy->next;
    }
};
ts
function deleteDuplicates(head: ListNode | null): ListNode | null {
    const dummy = new ListNode(0, head);
    let pre = dummy;
    let cur = head;
    while (cur) {
        while (cur.next && cur.val === cur.next.val) {
            cur = cur.next;
        }
        if (pre.next === cur) {
            pre = cur;
        } else {
            pre.next = cur.next;
        }
        cur = cur.next;
    }
    return dummy.next;
}
python
class Solution:
    def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]:
        dummy = pre = ListNode(next=head)
        cur = head
        while cur:
            while cur.next and cur.next.val == cur.val:
                cur = cur.next
            if pre.next == cur:
                pre = cur
            else:
                pre.next = cur.next
            cur = cur.next
        return dummy.next

Released under the MIT License.