Solution 1
实际上是83. Remove Duplicates from Sorted List 的变体,区别在于要求将重复的元素全部去掉,这里就需要稍稍调整一下实现,记录不同的相邻元素的前一个,然后向后倒,如果出现重复,找到重复段,然后更改前一个不同元素的next指针,否则同步向后遍历(始终保持不同相邻元素的前一个)。有可能第一个元素就是重复的,因此首先额外创建一个伪结点(列表中常这么干,记在小本本上!),返回时仅范围当前伪节点后面的部分。
- 时间复杂度: O ( n ) O(n) O(n),其中 n n n为链表长度,线性遍历
- 空间复杂度: O ( 1 ) O(1) O(1),仅维护常数个状态变量
/**
* 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) {
auto pseudoHead = new ListNode(0, head);
auto preP = pseudoHead; // 删除前的一位
while (head != nullptr) {
if (head->next != nullptr && head->val == head->next->val) {
// 有相等,找到连续相等的最后一个,甚至是到头
while (head->next != nullptr && head->val == head->next->val) {
head = head->next;
}
preP->next = head->next;
} else {
preP = preP->next;
}
head = head->next;
}
return pseudoHead->next;
}
};
Solution 2
Solution 1的Python实现
# 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: Optional[ListNode]) -> Optional[ListNode]:
pesudoHead = ListNode(0, head)
preP = pesudoHead
while head is not None:
if head.next is not None and head.val == head.next.val:
while head.next is not None and head.val == head.next.val: head = head.next
preP.next = head.next
else:
preP = preP.next
head = head.next
return pesudoHead.next