Day86 | 灵神 | 前后指针 删除排序链表中的重复元素 删除排序链表中的重复元素II

83.删除排序链表中的重复元素

83. 删除排序链表中的重复元素 - 力扣(LeetCode)

思路:

就是一道easy题目,思路并不难想,笔者是用两个指针,一个l一个r,他们之间相隔1,然后如果两个的值相等就把r所指向的节点给删了,然后更新r为r的下一个结点。如果值不相等,那自然一起往后走

也可以和灵神一样用一个指针,代码更简洁,但是我感觉两根指针可以把要做的事情想得更清楚一点?

完整代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/*
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(head==nullptr)
return head;
ListNode* l=head;
ListNode* r=head->next;
while(r)
{
if(r->val==l->val)
{
ListNode* p=r->next;
l->next=p;
r=p;
}
else
{
l=l->next;
r=r->next;
}
}
return head;
}
};*/

class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if (head == nullptr)
return nullptr;
ListNode* cur = head;
while (cur->next) // 看看下个节点……
if (cur->next->val == cur->val) // 和我一样,删!
cur->next = cur->next->next;
else
// 和我不一样,移动到下个节点
cur = cur->next;
return head;
}
};

82.删除排序链表中的重复元素II

82. 删除排序链表中的重复元素 II - 力扣(LeetCode)

思路:

和上一题一样,只是这道题要删除所有的相同元素,一个也不留下,所以l就指向相同部分的前一个结点,方便删除和删除之后连接链表

然后对相同的部分使用上一题的代码(用灵神的),即比较r和r->next的值然后进行删除。然后就把相同的部分删除的只剩下一个节点了,然后利用l再把剩下的那个结点给删了,然后更新r

这么说可能有点抽象,举个例子

链表[1,2,3,3,3,3,3,3,3,3,4,4,5]

1.我们遍历到l=2,r=第一个3的时候,发现有重复元素了

2.进行循环删除,删除后的数组为[1,2,3,4,4,5],此时l=2,r=3

3.更新l,利用l把3给删了,这样就把所有的重复元素都给删除了

4.更新r让r指向3的下一个节点4

5.此时数组为 [1,2,4,4,5],l=2,r=4

重复上述过程即可

完整代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
ListNode *t=new ListNode;
t->next=head;
ListNode *l=t;
ListNode *r=head;
while(r&&r->next)
{
if(r->val==r->next->val)
{
while(r->next&&r->val==r->next->val)
r->next=r->next->next;
l->next=l->next->next;
r=r->next;
}
else
{
l=l->next;
r=r->next;
}
}
return t->next;
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
ListNode dummy(0, head);
auto cur = &dummy;
while (cur->next && cur->next->next) {
int val = cur->next->val;
if (cur->next->next->val == val) { // 后两个节点值相同
// 值等于 val 的节点全部删除
while (cur->next && cur->next->val == val) {
cur->next = cur->next->next;
}
} else {
cur = cur->next;
}
}
return dummy.next;
}
};