AcWing 29. 刪除鏈表中重複的節點

題目地址 https://www.acwing.com/problem/content/description/27/算法

來源:劍指Offerspa

題目描述
在一個排序的鏈表中,存在重複的結點,請刪除該鏈表中重複的結點,重複的結點不保留。code

樣例blog

樣例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++ 代碼ip

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

 

做者:defddr
連接:https://www.acwing.com/solution/AcWing/content/2877/
來源:AcWing
著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。get

相關文章
相關標籤/搜索