Skip to content

Commit daa0112

Browse files
committed
feat: add solutions to lc problem: No.0082
No.0082.Remove Duplicates from Sorted List II
1 parent 4e5d8e5 commit daa0112

File tree

9 files changed

+310
-275
lines changed

9 files changed

+310
-275
lines changed

solution/0000-0099/0082.Remove Duplicates from Sorted List II/README.md

+112-92
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,16 @@
3838

3939
<!-- 这里可写通用的实现逻辑 -->
4040

41+
**方法一:一次遍历**
42+
43+
我们先创建一个虚拟头节点 $dummy$,令 $dummy.next = head$,然后创建指针 $pre$ 指向 $dummy$,指针 $cur$ 指向 $head$,开始遍历链表。
44+
45+
当 $cur$ 指向的节点值与 $cur.next$ 指向的节点值相同时,我们就让 $cur$ 不断向后移动,直到 $cur$ 指向的节点值与 $cur.next$ 指向的节点值不相同时,停止移动。此时,我们判断 $pre.next$ 是否等于 $cur$,如果相等,说明 $pre$ 与 $cur$ 之间没有重复节点,我们就让 $pre$ 移动到 $cur$ 的位置;否则,说明 $pre$ 与 $cur$ 之间有重复节点,我们就让 $pre.next$ 指向 $cur.next$。然后让 $cur$ 继续向后移动。继续上述操作,直到 $cur$ 为空,遍历结束。
46+
47+
最后,返回 $dummy.next$ 即可。
48+
49+
时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为链表的长度。
50+
4151
<!-- tabs:start -->
4252

4353
### **Python3**
@@ -51,16 +61,17 @@
5161
# self.val = val
5262
# self.next = next
5363
class Solution:
54-
def deleteDuplicates(self, head: ListNode) -> ListNode:
55-
dummy = ListNode(-1, head)
56-
cur = dummy
57-
while cur.next and cur.next.next:
58-
if cur.next.val == cur.next.next.val:
59-
val = cur.next.val
60-
while cur.next and cur.next.val == val:
61-
cur.next = cur.next.next
62-
else:
64+
def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]:
65+
dummy = pre = ListNode(next=head)
66+
cur = head
67+
while cur:
68+
while cur.next and cur.next.val == cur.val:
6369
cur = cur.next
70+
if pre.next == cur:
71+
pre = cur
72+
else:
73+
pre.next = cur.next
74+
cur = cur.next
6475
return dummy.next
6576
```
6677

@@ -81,17 +92,19 @@ class Solution:
8192
*/
8293
class Solution {
8394
public ListNode deleteDuplicates(ListNode head) {
84-
ListNode dummy = new ListNode(-1, head);
85-
ListNode cur = dummy;
86-
while (cur.next != null && cur.next.next != null) {
87-
if (cur.next.val == cur.next.next.val) {
88-
int val = cur.next.val;
89-
while (cur.next != null && cur.next.val == val) {
90-
cur.next = cur.next.next;
91-
}
92-
} else {
95+
ListNode dummy = new ListNode(0, head);
96+
ListNode pre = dummy;
97+
ListNode cur = head;
98+
while (cur != null) {
99+
while (cur.next != null && cur.next.val == cur.val) {
93100
cur = cur.next;
94101
}
102+
if (pre.next == cur) {
103+
pre = cur;
104+
} else {
105+
pre.next = cur.next;
106+
}
107+
cur = cur.next;
95108
}
96109
return dummy.next;
97110
}
@@ -114,67 +127,84 @@ class Solution {
114127
class Solution {
115128
public:
116129
ListNode* deleteDuplicates(ListNode* head) {
117-
ListNode* dummy = new ListNode(-1, head);
118-
ListNode* cur = dummy;
119-
while (cur->next != nullptr && cur->next->next != nullptr) {
120-
if (cur->next->val == cur->next->next->val) {
121-
int val = cur->next->val;
122-
while (cur->next != nullptr && cur->next->val == val) {
123-
cur->next = cur->next->next;
124-
}
125-
} else {
130+
ListNode* dummy = new ListNode(0, head);
131+
ListNode* pre = dummy;
132+
ListNode* cur = head;
133+
while (cur) {
134+
while (cur->next && cur->next->val == cur->val) {
126135
cur = cur->next;
127136
}
137+
if (pre->next == cur) {
138+
pre = cur;
139+
} else {
140+
pre->next = cur->next;
141+
}
142+
cur = cur->next;
128143
}
129144
return dummy->next;
130145
}
131146
};
132147
```
133148
149+
### **Go**
150+
151+
```go
152+
/**
153+
* Definition for singly-linked list.
154+
* type ListNode struct {
155+
* Val int
156+
* Next *ListNode
157+
* }
158+
*/
159+
func deleteDuplicates(head *ListNode) *ListNode {
160+
dummy := &ListNode{Next: head}
161+
pre, cur := dummy, head
162+
for cur != nil {
163+
for cur.Next != nil && cur.Next.Val == cur.Val {
164+
cur = cur.Next
165+
}
166+
if pre.Next == cur {
167+
pre = cur
168+
} else {
169+
pre.Next = cur.Next
170+
}
171+
cur = cur.Next
172+
}
173+
return dummy.Next
174+
}
175+
```
176+
134177
### **C#**
135178

136179
```cs
180+
/**
181+
* Definition for singly-linked list.
182+
* public class ListNode {
183+
* public int val;
184+
* public ListNode next;
185+
* public ListNode(int val=0, ListNode next=null) {
186+
* this.val = val;
187+
* this.next = next;
188+
* }
189+
* }
190+
*/
137191
public class Solution {
138-
private ListNode newHead;
139-
private ListNode last;
140-
private ListNode candidate;
141-
private int count;
142-
143192
public ListNode DeleteDuplicates(ListNode head) {
144-
while (head != null)
145-
{
146-
if (candidate == null || candidate.val != head.val)
147-
{
148-
TryAppend();
149-
candidate = head;
150-
count = 1;
151-
}
152-
else
153-
{
154-
++count;
155-
}
156-
157-
head = head.next;
158-
}
159-
TryAppend();
160-
if (last != null) last.next = null;
161-
return newHead;
162-
}
163-
164-
private void TryAppend()
165-
{
166-
if (count == 1)
167-
{
168-
if (newHead == null)
169-
{
170-
newHead = last = candidate;
193+
ListNode dummy = new ListNode(0, head);
194+
ListNode pre = dummy;
195+
ListNode cur = head;
196+
while (cur != null) {
197+
while (cur.next != null && cur.next.val == cur.val) {
198+
cur = cur.next;
171199
}
172-
else
173-
{
174-
last.next = candidate;
175-
last = last.next;
200+
if (pre.next == cur) {
201+
pre = cur;
202+
} else {
203+
pre.next = cur.next;
176204
}
205+
cur = cur.next;
177206
}
207+
return dummy.next;
178208
}
179209
}
180210
```
@@ -194,27 +224,19 @@ public class Solution {
194224
* @return {ListNode}
195225
*/
196226
var deleteDuplicates = function (head) {
227+
const dummy = new ListNode(0, head);
228+
let pre = dummy;
197229
let cur = head;
198-
let pre = new ListNode(0);
199-
pre.next = head;
200-
let dummy = pre;
201-
let rep = false;
202-
if (!head || !head.next) {
203-
return head;
204-
}
205230
while (cur) {
206-
while (cur.next && cur.val == cur.next.val) {
231+
while (cur.next && cur.val === cur.next.val) {
207232
cur = cur.next;
208-
rep = true;
209233
}
210-
if (rep) {
211-
pre.next = cur.next;
212-
cur = cur.next;
213-
} else {
234+
if (pre.next === cur) {
214235
pre = cur;
215-
cur = cur.next;
236+
} else {
237+
pre.next = cur.next;
216238
}
217-
rep = false;
239+
cur = cur.next;
218240
}
219241
return dummy.next;
220242
};
@@ -236,21 +258,19 @@ var deleteDuplicates = function (head) {
236258
*/
237259

238260
function deleteDuplicates(head: ListNode | null): ListNode | null {
239-
const dummy = new ListNode(101, head);
240-
let p = dummy;
241-
let c = dummy;
242-
let count = 1;
243-
while (c != null) {
244-
if (c.val !== (c.next ?? {}).val) {
245-
if (count === 1) {
246-
p = c;
247-
} else {
248-
p.next = c.next;
249-
}
250-
count = 0;
261+
const dummy = new ListNode(0, head);
262+
let pre = dummy;
263+
let cur = head;
264+
while (cur) {
265+
while (cur.next && cur.val === cur.next.val) {
266+
cur = cur.next;
267+
}
268+
if (pre.next === cur) {
269+
pre = cur;
270+
} else {
271+
pre.next = cur.next;
251272
}
252-
c = c.next;
253-
count++;
273+
cur = cur.next;
254274
}
255275
return dummy.next;
256276
}

0 commit comments

Comments
 (0)