📌  相关文章
📜  从排序的链表中删除所有出现的重复项(1)

📅  最后修改于: 2023-12-03 15:21:57.890000             🧑  作者: Mango

从排序的链表中删除所有出现的重复项

删除链表中出现的重复项,要求保留链表中没有重复的元素,链表中的所有元素都是按照升序排列的。

示例

输入: 1->2->3->3->4->4->5 输出: 1->2->5

输入: 1->1->1->2->3 输出: 2->3

解题思路

此题需要遍历链表,判断当前节点与它后面的节点是否重复,或者当前节点与它前面的节点是否重复。如果重复,需要删除当前节点并将前一个节点与后一个节点相连。我们可以通过两个指针的方法来判断重复,分别为 prevcur 指针。初始时,prev 指向头结点,cur 指向头结点的下一个节点。如果 prevcur 节点的值相同,则将 cur 后移,继续判断。如果不相同,则 prev 移动到 cur 所在位置,cur 向后移动一个位置。这样,当 cur 遍历到链表末尾时,重复元素已经被删除,链表也被整理完毕。

代码实现
class Solution:
    def deleteDuplicates(self, head: ListNode) -> ListNode:
        if not head:
            return None
        
        dummy = ListNode(0)
        dummy.next = head
        
        prev = dummy
        cur = head
        
        while cur:
            while cur.next and cur.val == cur.next.val:
                cur = cur.next
            
            if prev.next == cur:
                prev = prev.next
            else:
                prev.next = cur.next
            
            cur = cur.next
        
        return dummy.next
class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        if (head == null) {
            return null;
        }
        
        ListNode dummy = new ListNode(0);
        dummy.next = head;
        
        ListNode prev = dummy;
        ListNode cur = head;
        
        while (cur != null) {
            while (cur.next != null && cur.val == cur.next.val) {
                cur = cur.next;
            }
            
            if (prev.next == cur) {
                prev = prev.next;
            } else {
                prev.next = cur.next;
            }
            
            cur = cur.next;
        }
        
        return dummy.next;
    }
}
时间复杂度

由于每个节点都只会被遍历一次,因此时间复杂度为:$O(n)$。

空间复杂度

由于只需要维护两个指针,空间复杂度为:$O(1)$。