题解 | #删除有序链表中重复的元素-II#
删除有序链表中重复的元素-II
https://www.nowcoder.com/practice/71cef9f8b5564579bf7ed93fbe0b2024
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
class Solution {
public:
/**
*
* @param head ListNode类
* @return ListNode类
*/
ListNode* deleteDuplicates(ListNode* head) {
if(!head || !head->next) return head;
auto dummy=new ListNode(1010);
dummy->next=head;
auto q=dummy, p=head;
while(p)
{
if(p->next && p->val==p->next->val)
{
auto t=p;
while(p && p->val==t->val) p=p->next;
q->next=p;
}
else
{
p=p->next;
q=q->next;
}
}
return dummy->next;
}
};
- 由于可能需要删除头结点,因此在头部添加一个虚拟节点dummy;
- 使用q指向需要删除的一段元素的前继;t指向删除区间的开始,用于对比是否q需要向后移动;q指向删除区间的下一元素(这里只要q不为null且与t的val相同就向后移动)
- 令q->next=p
#### 注意
- 要看清楚题目,是删除所有重复的元素,而不是保留重复的元素中的一个
- 由于头结点可能会被删除,所以最后返回的是`dummy->next`而不是head
OPPO公司福利 1101人发布
查看11道真题和解析