题解 | 删除有序链表中重复的元素-II
删除有序链表中重复的元素-II
https://www.nowcoder.com/practice/71cef9f8b5564579bf7ed93fbe0b2024
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) : val(x), next(nullptr) {}
* };
*/
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @return ListNode类
*/
ListNode* deleteDuplicates(ListNode* head) {
// write code here
if (!head) return head;
auto pre_2 = new ListNode(0); pre_2->next = head;
ListNode *pre = head, *cur = head->next;
const ListNode* newHead = pre_2;
while (cur) {
if (pre->val == cur->val) {
cur = cur->next;
continue;
}
if (pre->next != cur) {
pre_2->next = cur;
pre = cur;
cur = cur->next;
} else {
pre_2 = pre;
pre = cur;
cur = cur->next;
}
}
if (pre->next != cur) {
pre_2->next = cur;
pre = cur;
}
return newHead->next;
}
};
题干分析:
题目要求我们对一个链表只要发生了值重复的节点就进行删除操作,且要求删除所有具有相同重复值的节点.换句话说就是该链表只允许单个值出现在单个节点中.
算法思路:
因为需要将所有相同值得节点移出链表,因此至少需要标记当前正在判断的节点前一个节点与前一个节点的再前一个节点(或者标记开始重复的节点前一个节点)因此至少需要维护三个链表节点指针.
更加具体的算法逻辑见图:
开始
循环执行:
继续跳到cur指向首个不为5的节点
尾部处理:
复杂度分析:
时间复杂度:全过程针对每个节点进行一次遍历,总时间复杂度为O(n).
空间复杂度:全过程只用到了常数的额外空间,因此空间复杂度为O(1).
注:本实现方法并未进行节点删除,在正式的生产开发中注意使用delete或者free释放内存,防止内存泄漏.
