题目链接:leetcode82
题目大意
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。 示例一: 输入: 1->2->3->3->4->4->5 输出: 1->2->5 示例二: 输入: 1->1->1->2->3 输出: 2->3
简而言之就是删掉原始序列中,所有出现次数大于1的元素。
解题思路
直接删除
AC 的代码就是这个方法,但逻辑可能略显冗余。先建一个头节点使链表变成带头节点的单链表。然后就是p、q两个指针分别表示相邻两种元素,如果发现靠后的指针的下一个节点有重复,那么就一直删掉,最后一个元素最后特判删除。
时间复杂度
O
(
n
)
O(n)
O(n), 空间复杂度
O
(
1
)
O(1)
O(1)。
代码实现
class Solution {
public:
ListNode
* deleteDuplicates(ListNode
* head
) {
ListNode
*q
, *p
, *h
= new ListNode(0);
bool flag
;
h
->next
= head
;
q
= h
; p
= head
;
while (p
&& p
->next
) {
flag
= true;
while (p
->next
&& p
->val
== p
->next
->val
) {
p
= p
->next
;
delete q
->next
;
q
->next
= p
;
flag
= false;
}
if (flag
) {
q
= p
;
p
= p
->next
;
} else {
p
= p
->next
;
delete q
->next
;
q
->next
= p
;
}
}
return h
->next
;
}
};