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

存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。

返回同样按升序排列的结果链表。

示例 1:

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

示例 2:

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

提示:

以下错误的选项是?

## aop ### before ```c #include using namespace std; struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; ``` ### after ```c ``` ## 答案 ```c class Solution { public: ListNode *deleteDuplicates(ListNode *head) { if (!head || !head->next) return head; auto dummy = new ListNode(-1); dummy->next = head; auto pre = dummy, cur = head; while (cur && cur->next) { if (cur->val != cur->next->val) { pre = cur; cur = cur->next; } else { while (cur->next && cur->val == cur->next->val) { cur = cur->next; } } } return dummy->next; } }; ``` ## 选项 ### A ```c class Solution { public: ListNode *deleteDuplicates(ListNode *head) { if (!head || !head->next) return head; if (head->val == head->next->val) { while (head->next && head->val == head->next->val) { head = head->next; } return deleteDuplicates(head->next); } else head->next = deleteDuplicates(head->next); return head; } }; ``` ### B ```c class Solution { public: ListNode *deleteDuplicates(ListNode *head) { ListNode *new_head = new ListNode(0); ListNode *cur = new_head; ListNode *temp1 = head; while (temp1) { ListNode *temp2 = temp1->next; if (!temp2) { cur->next = temp1; temp1 = temp1->next; cur = cur->next; } else if (temp2 && temp1->val != temp2->val) { cur->next = temp1; temp1 = temp1->next; cur = cur->next; } else { while (temp2 && temp1->val == temp2->val) { temp2 = temp2->next; } temp1 = temp2; } } cur->next = NULL; return new_head->next; } }; ``` ### C ```c class Solution { public: ListNode *deleteDuplicates(ListNode *head) { if (head == NULL || head->next == NULL) return head; ListNode *L = new ListNode(0); L->next = head; ListNode *slow = L; while (slow->next) { ListNode *fast = slow->next; while (fast->next && fast->val == fast->next->val) { fast = fast->next; } if (slow->next == fast) slow = slow->next; else { slow->next = fast->next; } } return L->next; } }; ```