踩坑记录[3]——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
- 题目数据保证链表已经按升序 排列
- 链表中节点数目在范围
答案(C++语言,已通过LeetCode测试)
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(head == nullptr)
return nullptr;
ListNode *slow = head, *fast = head;
while(fast != nullptr){
if(slow->val != fast->val){
slow->next = fast;
slow = slow->next;
}
fast = fast->next;
}
slow->next = nullptr;
return head;
}
};
踩坑记录
本题目为双指针题型,核心解题思想:定义快、慢两个指针,快指针fast
先出发,当fast
所指向的值与slow
所指向的值不相等时,slow
走一步并将所指向的值修改为fast
所指向的值。
这是由于对于排序链表,重复的值都是在一块的,当快指针fast
与慢指针slow
之间的值不相等时,说明fast
已经走出了这个值的范围。此时,让slow
更新位置和值,进行下一个重复值的”删除“。最后返回slow
所在位置及之前的部分链表即可。
-
容易忽略
head == nullptr
需要在初始时做个判断,否则会有错误。
-
容易忘记令
slow->next == nullptr
本题的目的是获得删除重复值之后的链表,因此最终只需要
slow
所在位置及之前的部分链表,则必须令slow->next == nullptr
。