LeetCode Remove Duplicates 个人解法以及一些高效解法

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.

解法思路:

最关键是利用map.

 第一次遍历,记录重复次数.第二次遍历,将重复次数为1的节点插入到新链表里面.输出新链表即为解.

C++ Solution:

ListNode *deleteDuplicates(ListNode *head) {
if (head == NULL || head->next == NULL) return head;
ListNode* hea = head;
map<int, int> m;
while (hea)
{
m[hea->val]++;
hea = hea->next;
}
int j = 0;
int typ = 0;//若无非重复的则为0
ListNode* result = NULL;
ListNode* temp = NULL;
temp = (ListNode*)malloc(sizeof(ListNode));
result = temp;
if (m.size()==1)
{
return NULL;
}
for (map<int, int>::iterator i = m.begin(); i != m.end(); i++)
{
if (i->second == 1)
{
//插入到新链表 尾插法
if (j==0)
{
typ = 1;
temp->val = i->first;
temp->next = NULL;
j++;
} else{
ListNode* p = (ListNode*)malloc(sizeof(ListNode));
p->next = NULL;
p->val = i->first;
temp->next = p;
temp = temp->next;
}
}
}
if (typ==0)//全为重复的时候的输出
{
return NULL;
}
return result;
}


别人解法:利用递归,巨高效.....我怎么就没想到,递归节省空间也没有创建新链表.

ListNode *deleteDuplicates(ListNode *head) {
    // Start typing your C/C++ solution below
    // DO NOT write int main() function
    if(head==NULL || head->next==NULL)
        return head;
    ListNode * p = head;
     8     while(p->next!=NULL && p->val == p->next->val){
        p=p->next;
    }


    if(p!=head){
        while(head!=p->next)
        {
            ListNode * tmp = head;
            head=head->next;
            free(tmp);
        }


        return deleteDuplicates(p->next);
    }


    head->next=deleteDuplicates(head->next);
    return head;
}  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值