给定一个已排序的链表的头 head
, 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。
示例 1:
输入:head = [1,2,3,3,4,4,5]
输出:[1,2,5]
示例 2:
输入:head = [1,1,1,2,3]
输出:[2,3
这个题的思想不难,难的是细节
1)我这里用的是,先常规的去遍历找到重复出现过得数,如果这个数重复出现了,那么nums的值就会大于一;
2)由于这里可能会出现第一个头结点就重复所以我们需要新设置一个结点指向头结点,不然删除第一个头结点后面的元素就会丢失,我们设置俩个指针,指向我们新设置的这个结点new_head,pre这个指针的作用是帮我们探路,如果发现这个结点满足条件是等于1的那么另一个指向new_head 的结点就把它的next指过来
3)最后我们由于没有把new_head给移动过,所以我们可以通过遍历其next遍历完整个链表,即返回new_head->next
正确代码1:
class Solution { public: ListNode* deleteDuplicates(ListNode* head) { map<int,int>nums; ListNode *p = head; ListNode *new_head = new ListNode(0,head); ListNode *pre = new_head; ListNode *temp = new_head; //new_head->next =head; while(p) { nums[p->val]++; p = p->next; } pre = pre->next; while(pre){ if(nums[pre->val] > 1){ temp->next= NULL; pre =pre->next; } else { temp->next =pre; temp = temp -> next; pre = pre->next; } } if(temp == new_head) return NULL; return new_head->next; } };
官方解答
class Solution { public: ListNode* deleteDuplicates(ListNode* head) { if (!head) { return head; } ListNode* dummy = new ListNode(0, head); ListNode* cur = dummy; while (cur->next && cur->next->next) { if (cur->next->val == cur->next->next->val) { int x = cur->next->val; while (cur->next && cur->next->val == x) { cur->next = cur->next->next; } } else { cur = cur->next; } } return dummy->next; } };