)
问题描述
给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。
示例 1:
输入:head = [1,1,2]
输出:[1,2]
示例 2:
输入:head = [1,1,2,3,3]
输出:[1,2,3]
提示:
链表中节点数目在范围 [0, 300] 内
-100 <= Node.val <= 100
题目数据保证链表已经按升序 排列
解题思路
创建两个创建两个指针p1,p2都指向头指针。p2负责遍历链表,p1负责连接节点。首先让p2向链表后方移动,链表是有序的,因此相等的数是紧挨在一起的,所以当p1->val与p2->val不相等时,说明p2已经跳过了 所有值与p1->val想同的数,让p1->next=p2; p1=p2这样便完成了一次删除相同数的操作。
遇到问题
第一个问题:题目给的是头链表,但是头链表中的val不为空
第二个问题:在第三个测试用例中头链表为[],代表的含义是head==nullprt,而不是head->val=0;或者head->next=nullptr。
代码
/**
* 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) {
if(head == nullptr)
{
return head;
}
ListNode* p1 = new ListNode;
ListNode* p2 = new ListNode;
p1 = head;
p2 = head;
while (p2 != nullptr)
{
if (p1->val == p2->val)
{
p2 = p2->next;
}
else
{
p1->next = p2;
p1 = p2;
}
}
p1->next = nullptr;
return head;
}
};```