题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留。
样例
样例1
输入:1->2->3->3->4->4->5
输出:1->2->5
样例2
输入:1->1->1->2->3
输出:2->3
算法1
这是投机取巧的做法
在时间和空间不太要求的情况下
可使用STL进行unique的操作
遍历链表 将元素放进map
在遍历map将不重复的元素放进链表
注意边界条件
C++ 代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
map<int,int> s;
ListNode* deleteDuplication(ListNode* head) {
ListNode* p = head;
//边界情况直接返回
if(p == NULL)
return p;
//将链表数值放入map 让容器自动去重
while(p != NULL){
s[p->val]++;
p = p->next;
}
p = head;
ListNode* pre=head;
//遍历容器 再次放入链表
for(auto& e:s){
if(e.second == 1){
p->val = e.first;
pre = p;
p = p->next;
}
}
//多余的链表删除 这里直接NULL 没有释放
pre->next=NULL;
//注意边界条件 此处讨论区指出错误,请自行辨别修改
if(pre == head)
return NULL;
return head;
}
};
将某一个结点置空,输出的是[0],但是答案要求[],咋办呢
样例输入是?
4,4,4
输入
[4,4,4]
输出
[]
刚测试的是返回空, 要不在确定下?
如果输入只有一个呢
将最后的判断pre==head改为pre=p;是不是好一点。
是的 ,这里特判写错了。谢谢
也可以开始直接判断 head!=NULL && head->next==NULL 说明只有一个元素,直接返回就好。
代码主体思路是对的,特判情况可以自行添加。
orz
赞,其实我也想着用map的
赞👍
大佬点评 哈哈