[leetcode]Remove Duplicates from Sorted List II

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;
       }

    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值