题目地址:
https://www.acwing.com/problem/content/27/
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留。
每次先走到等于当前节点数值的节点中的最后一个,如果当前就是最后一个,则说明没有重复,直接append到后面,否则不append。代码如下:
#include <iostream>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
ListNode* deleteDuplication(ListNode* head) {
ListNode *prev = new ListNode(0), *res = prev, *cur = head;
while (cur) {
ListNode* tmp = cur;
while (tmp->next && tmp->next->val == cur->val) tmp = tmp->next;
if (tmp == cur) {
prev->next = cur;
prev = prev->next;
}
cur = tmp->next;
}
// 将最后的指针断掉
prev->next = nullptr;
return res->next;
}
};
时间复杂度 O ( n ) O(n) O(n), n n n为链表长度,空间 O ( 1 ) O(1) O(1)。