描述
给出一个升序排序的链表,删除链表中的所有重复出现的元素,只保留原链表中只出现一次的元素。
例如:
给出的链表为1 \to 2\to 3\to 3\to 4\to 4\to51→2→3→3→4→4→5, 返回1\to 2\to51→2→5.
给出的链表为1\to1 \to 1\to 2 \to 31→1→1→2→3, 返回2\to 32→3.
例如:
给出的链表为1 \to 2\to 3\to 3\to 4\to 4\to51→2→3→3→4→4→5, 返回1\to 2\to51→2→5.
给出的链表为1\to1 \to 1\to 2 \to 31→1→1→2→3, 返回2\to 32→3.
数据范围:链表长度 0 \le n \le 100000≤n≤10000,链表中的值满足 |val| \le 1000∣val∣≤1000
要求:空间复杂度 O(n)O(n),时间复杂度 O(n)O(n)
进阶:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)
这个题有点意思,逻辑也不复杂。
在之前的删除重复元素的题的基础上,增加了一个难度,是要删除所有的重复元素,而不是需要留下一个。
所以需要做一个标记。
满足这个标记的时候,在删除之前节点的基础上,直接删除当前的节点。
class Solution { public: /** * * @param head ListNode类 * @return ListNode类 */ ListNode* deleteDuplicates(ListNode* head) { // write code here ListNode *res = new ListNode(-1); res->next = head; ListNode *pre = res; ListNode *cur = head; while(cur && cur->next != NULL){ bool flag = false; while(cur->next && cur->val == cur->next->val){ flag = true; cur->next = cur->next->next; } if(flag){ pre->next = cur->next; }else{ pre = cur; } cur = cur->next; } return res->next; } };