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
解題思路:
方法1:可以使用遞歸法來解決,時間複雜度爲O(n),空間複雜度爲O(1)。
代碼如下:
ListNode *deleteDuplicates(ListNode *head) {
if(!head || !head->next) {
return head;
}
ListNode *p = head->next;
if(head->val == p->val) {
while(p && head->val == p->val) {
ListNode *tmp = p;
p = p->next;
delete tmp;
}
delete head;
return deleteDuplicates(p);
} else {
head->next = deleteDuplicates(head->next);
return head;
}
}
方法2:使用迭代法,時間複雜度爲O(n),空間複雜度爲O(1)
ListNode *deleteDuplicates(ListNode *head) {
if(head == nullpstr) {
return head;
}
ListNode dummy(INT_MIN);
dummy.next = head;
ListNode *pre = &dummy;
ListNode *cur = head;
while(cur != nullpstr) {
bool duplicated = false;
while(cur->next != nullpstr && cur->val == cur->next->val) {
duplicated = true;
ListNode *tmp = cur;
cur = cur->next;
delete tmp;
}
if(duplicated) {
ListNode *temp = cur;
cur = cur->next;
delete tmp;
continue;
}
pre->next = cur;
pre = pre->next;
cur = cur->next;
}
pre->next = cur;
return dummy.next;
}