1、描述
存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。
返回同样按升序排列的结果链表。
链接
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2、关键字
链表、去重、重复的一个都不留,
3、思路
遍历,如果相等 就临时记录后面两个值,便于去重,如果不等就直接往后移动就好了
4、notes
1、链表使用之前先判断非空
5、复杂度
时间:O(N)连标长度
空间:O(1)
6、code
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
auto dummy=new ListNode(0,head); // 构造一个前哑节点
auto h1=dummy; // 记录哑节点
while( dummy->next !=nullptr && dummy->next->next !=nullptr){ // 比较后边两个节点
ListNode* tem = dummy->next; // 后面第一个
if (tem->val == tem->next->val){ // 如果相等
auto tem2 = tem->next; // 后面第二个
while(tem2 != nullptr && tem->val == tem2->val){ // 如果后面的两个都相等,就后面那个再往后,直到找到不等的时候,
tem2 =tem2->next;
}
dummy->next=tem2;
}
else // 如果不等直接 向后移动
dummy=tem;
}
return h1->next;
}
};