leetcode 83.删除排序链表中的重复元素
题干
存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 。
返回同样按升序排列的结果链表。
示例 1:
输入:head = [1,1,2]
输出:[1,2]
示例 2:
输入:head = [1,1,2,3,3]
输出:[1,2,3]
提示:
链表中节点数目在范围 [0, 300] 内
-100 <= Node.val <= 100
题目数据保证链表已经按升序排列
题解
删除连续重复元素中除开头外的全部元素,即对于每种数字来说,第一个该数字是不会被删除的。
所以我们设置两个指针,一个指针指向第一个数字,另一个指针指向下一种不相同的数字的第一个数字。
开始两指针同时指向开头,不断后移第二个指针直到两指针指向的数字不相等,然后进行连接即可。
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
ListNode* sameHead = head;
ListNode* notSameHead = head;
while(notSameHead != nullptr){
while(notSameHead != nullptr && notSameHead->val == sameHead->val){
notSameHead = notSameHead->next;
}
sameHead->next = notSameHead;
sameHead = notSameHead;
}
return head;
}
};
用栈的话会更容易理解,如果遍历到的数和栈顶元素相同就说明是重复元素需要删除,如果遍历到的数和栈顶元素不同就将栈顶元素的next指向遍历到的数,并且将其入栈。
最后处理一下边界情况即可(连续数字出现在末尾时由于没有遍历到新的数字所以并没有删除,所以弹出循环后手动将栈顶元素的next设为nullptr)
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
stack<ListNode*> stk;
ListNode* ptr = head;
if(ptr == nullptr) return head;
while(ptr != nullptr){
if(stk.empty()) stk.push(ptr);
else if(stk.top()->val != ptr->val){
stk.top()->next = ptr;
stk.push(ptr);
}
ptr = ptr->next;
}
stk.top()->next = nullptr;
return head;
}
};