删除排序链表中的重复元素(系列)

· 约 1 分钟阅读 · 次阅读 leetcode

83.删除重复元素,保留一个

给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def deleteDuplicates(self, head: ListNode) -> ListNode:
        if not head:
            return head
        p = head
        q = head.next
        while q:
            if q.val == p.val:
                r = q.next
                p.next = r
                del q
                q = r
            else:
                p = q
                q = q.next
        return head
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        if (head == nullptr) return head;
        ListNode* p = head, *q = head->next;
        while(q != nullptr) {
            if (q->val == p->val) {
                p->next = q->next;
                ListNode* tmp = q;
                q = q->next;
                delete tmp;
            }else{
                q = q->next;
                p = p->next;
            }
        }
        return head;
    }
};

删除所有重复的元素

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

细节题, 关键点是有可能删除第一个元素,为了方便,一般需要添加一个dummy节点

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def deleteDuplicates(self, head: ListNode) -> ListNode:
        if not head:
            return head
        
        dummy = ListNode(next=head)
        p = dummy
        q = dummy.next
        while q and q.next:
            if q.val == q.next.val:
                last_deleted = q.val
                while q and q.val == last_deleted:
                    r = q.next
                    p.next = r
                    del q
                    q = r
            else:
                p = q
                q = q.next
        return dummy.next