82. Remove Duplicates from Sorted List II
- Total Accepted: 97678
- Total Submissions: 339601
- Difficulty: Medium
- Contributors: Admin
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.
分析
使用三个指针
pre, cur, sub
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode* deleteDuplicates(ListNode* head) { if(head == NULL || head->next == NULL) return head; ListNode dummy(0); ListNode* pre = &dummy; ListNode* cur = head; dummy.next = head; while(cur != NULL && cur->next != NULL){ //sub record the first node tha differ with cur ListNode* sub = cur->next; while(sub != NULL && cur->val == sub->val){ sub = sub->next; } if(cur->next != sub){ pre->next = sub; deleteList(cur, sub); cur = sub; } else{ pre = cur; cur = cur->next; } } return dummy.next; } void deleteList(ListNode* head, ListNode* end){ while(head != end){ ListNode* d = head; head = head->next; delete d; } }}; |
使用递归方法
找到最接近的unique的node,对之后的进行delete
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | class Solution {public: ListNode* deleteDuplicates(ListNode* head) { if(head == NULL || head->next == NULL) return head; ListNode* p = head->next; if(head->val != p->val){ head->next = deleteDuplicates(p); return head; } else{ while(p != NULL && p->val == head->val) p = p->next; return deleteDuplicates(p); } }}; |
浙公网安备 33010602011771号