删除排序链表中的重复元素(系列)
· 约 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