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