标签:list
Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.
For example,
Given 1->2->3->3->4->4->5, return 1->2->5.
Given 1->1->1->2->3, return 2->3.
这一题是接着上一题做的。说实话,做了好久。一开始想的一直都是错的。
一开始想是打表记录链表中每一个元素出现的次数,然后遍历链表,根据打表的结果判断该元素是不是要删除。这样做时间复杂度是O(n),但是占用空间很多。后来发现题目中的意思是删除连续的数字,而不是1213变成23这样的,没必要这么做。
但是后面我又犯了一个错误:就是想在函数当中构造一个链表,然后返回这个链表的值。这样做是不合适的,因为函数调用之后申请的内存被回收,构造的链表就会出错,唯一解决的方法就是事先申请好一部分空间,但是由于我们完全不知道题目的规模,这样做是非常不好的。也导致我浪费了快2小时=.=(
ListNode* res,*tmp;
std::map<int,int> ans;
ListNode *deleteDuplicates(ListNode *head) {
ListNode * i,*k,*aa;
int j;
bool flag=true;
if(head == NULL || head->next == NULL) return head;
for(j=-65536;j<65537;j++) ans.insert(std::pair<int, int>(j, 0));
for(i=head;i!=NULL;i=i->next){
ans[i->val]++;
//cout<<ans[i->val]<<endl;
}
for(i=head;i!=NULL;i=i->next){
if(ans[i->val]==1){
int *a = new int;
ListNode l(i->val) ;
//cout<<l.val<<endl;
if(flag==true) {
ListNode m(i->val) ;
res = &m;
//tmp = new ListNode();
tmp = res;
cout<<tmp->val<<endl;
flag = false;
}
else{
res ->next = &l;
res = res->next;
cout<<tmp->next->val<<endl;
}
//cout<<res->val<<endl;
}
}
cout<<tmp->val<<endl;
cout<<tmp->next->val<<endl;
return tmp;
}
所以遇到这样的题正确的思路就是直接修改给出的参数head,然后返回它。稍微思考一下发现还是很好想的。如果一开始就出现重复的话,把重复的部分全部去掉(head指针向后移)。如果不是的话就处理head->next。稍微用一下递归。
正确代码如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *deleteDuplicates(ListNode *head) {
if(head==NULL || head->next==NULL) return head;
bool flag = false;
while( head->next!=NULL && head->val == head->next->val ){
head=head->next;
flag=true;
}
if(flag) {
head=head->next;
return deleteDuplicates(head);
}
else{
head->next = deleteDuplicates(head->next);
return head;
}
}
};
[leetcode]Remove Duplicates from Sorted List II
标签:list
原文地址:http://blog.csdn.net/iboxty/article/details/44874143