删除链表中多余的重复结点I
首先对于一个有序的结点递增的链表,删除重复的结点,只保留一份重复的结点。
Given 1->1->2, return 1->2. Given 1->1->2->3->3, return 1->2->3.
只需要一个结点指针就能够完成操作。
ListNode* deleteDuplicates(ListNode* head) { if(head == NULL) { return NULL; } ListNode *r = head; while(r->next != NULL) { if(r->val == r->next->val) { ListNode *tmp = r->next; r->next = tmp->next; delete tmp; tmp = NULL; } else { r = r->next; } }//while return head; }
删除链表中重复的全部结点II
Given 1->2->3->3->4->4->5, return 1->2->5. Given 1->1->1->2->3, return 2->3.
注意这里有可能把头指针指向的结点删除了,所以要利用一个头结点,这样的话就可以不用单独的处理删除头指针指向的结点了。
ListNode* deleteDuplicates(ListNode* head) { ListNode *start = new ListNode(-1); start->next = head; if(head == NULL || head->next == NULL) { return head; } ListNode *pre = start; while(pre->next != NULL) { ListNode *cur = pre->next; while(cur->next != NULL && cur->next->val == cur->val) { cur = cur->next; }//while if(cur == pre->next) { pre = pre->next; } else { ListNode *tmp = pre->next; pre->next = cur->next; DeleteListNode(tmp, cur); }//else }//while return start->next; } void DeleteListNode(ListNode *start, ListNode *end) { ListNode *tmp = NULL; while(start != end) { tmp = start; start = start->next; delete tmp; } delete start; }
有序数组去重,删除重复出现的数字
从最后的结果看来,无非就是最后数组的前面剩下几个数字,然后返回数组的元素的个数。
Given input array nums = [1,1,2],return [1,2,...],length = 2
想到这里,可以利用划分中small标识的方法:
int removeDuplicates(vector<int>& nums) { if(nums.size() == 0) { return 0; } int size = nums.size(); int small = 0; for(int i = 1; i < size; ++i) { if(nums[i] > nums[small]) { ++small; if(small != i) { swap(nums[i], nums[small]); } }//if }//for return small + 1; } void swap(int &a, int &b) { int temp = a; a = b; b = temp; }