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