1.删除排序链表中的重复元素Ⅰ
题目描述:
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
示例 1:
输入: 1->1->2
输出: 1->2
示例 2:
输入: 1->1->2->3->3
输出: 1->2->3
思路分析:采用双指针法,p指向当前位置,tmp指向后一个不重复的位置,再将p的next直接指向tmp。
例:
代码:
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(head == nullptr || head->next == nullptr)
return head;
ListNode* p = head;
ListNode* tmp = nullptr;
while(p != nullptr)
{
tmp = p->next;
while(tmp != nullptr && tmp->val == p->val)
tmp = tmp->next;
if(p->next != tmp)//不相等则有重复节点,释放节点,避免内存泄漏
{
ListNode* q = p->next;
while(q != nullptr && q->val == p->val)
{
ListNode* Free = q;
q = q->next;
delete Free;
Free = nullptr;
}
}
p->next = tmp;//改变指向
p = p->next;//改变p的位置
}
return head;
}
};
2.删除排序链表中的重复元素Ⅱ
题目描述:
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中没有重复出现的数字。
示例 1:
输入: 1->2->3->3->4->4->5
输出: 1->2->5
示例 2:
输入: 1->1->1->2->3
输出: 2->3
思路分析:该题不保留重复的节点,则需要考虑是否改变头节点。故借用一个辅助空间,作为头节点,避免头节点更改时发生错误。
- 申请一个辅助空间
- 释放重复的元素
- 返回辅助空间的下一个
采用三指针法:
- prev保存重复节点的上一个节点
- p保存重复节点的首位置
- tmp保存于p不重复的位置
例:
代码:
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(head == nullptr || head->next == nullptr)
return head;
ListNode* pHead = new ListNode(0);
pHead->next = head;
ListNode* p = head;
ListNode* tmp = nullptr;
ListNode* prev = pHead;
while(p != nullptr)
{
tmp = p->next;
while(tmp != nullptr && p->val == tmp->val)
tmp = tmp->next;
if(p->next != tmp)//不相等则有重复,释放空间
{
while(p != tmp)
{
ListNode* Free = p;
p = p->next;
delete Free;
}
prev->next = tmp;
continue;
}
prev = p;//没有重复时,需要改变prev 的位置
p = p->next;//改变位置
}
head = pHead->next;
delete pHead;//释放申请的空间
pHead = nullptr;
return head;//返回
}
};