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
.
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
// (1)-same->(1)-false->(2)-false->(3)->NULL 第一次进入 返回head指向2 (要判断2的前面是false 后面也是false)
//保重返回的head绝不重复,可以直接判断head->next
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(head==NULL || head->next==NULL)
return head;
ListNode* nodeTmp=head;
bool isSame=false;
while(nodeTmp->next){
if(nodeTmp->val ==nodeTmp->next->val)
isSame=true;
else{
if(isSame==false ) //nodeTmp->val !=nodeTmp->next->val即后面是false 同时isSame==false即前面是false,所以 nodeTmp->val不是重复的,不用跳了-----@
break;
else //nodeTmp->val !=nodeTmp->next->val 后面是false,但是isSame=true与前一个相同, 所以 nodeTmp->val 是重复的,注意要设置isSame=false作为下一次的前面状态,然后继续跳
isSame=false;//---当nodeTmp=nodeTmp->next后 nodeTmp->next为空回退出循环此时nodeTmp执行过了nodeTmp=nodeTmp->next不重复了,或者不空继续--@
}
nodeTmp=nodeTmp->next;
}
if(isSame) //到末尾了
head=nodeTmp->next;
else // isSame==false nodeTmp->val不重复 -----@
head=nodeTmp;
if(head==NULL)
return NULL;
if(head->next)
head->next=deleteDuplicates(head->next);
return head;
}
};
//转自https://github.com/soulmachine/leetcode
// LeetCode, Remove Duplicates from Sorted List II
// 递归版,时间复杂度O(n),空间复杂度O(1)
class Solution {
public:
ListNode *deleteDuplicates(ListNode *head) {
if (!head || !head->next) return head;
ListNode *p = head->next;
if (head->val == p->val) { // 去掉前面相同的 如 1122去掉11 将22继续递归 ,不能保重p的不重复,所以不能直接判断p->next
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;
}
}
};