给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。
输入:head = [1,2,3,3,4,4,5]
输出:[1,2,5]
提示:
链表中节点数目在范围 [0, 300] 内
-100 <= Node.val <= 100
题目数据保证链表已经按升序 排列
/*** 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(-1);dummy->next = head;auto p = dummy;while(p->next) {auto q = p->next->next;while(q && q->val == p->next->val) q = q->next; // q找到下一个不同值的节点,也就是p的后2段数的开始if(p->next->next == q) p = p->next; // 如果p的后面第二个数等于找到的q,说明后面第一个数是没有重复的else // 否则的话覆盖掉重复的p->next = q;}return dummy->next;}
};