Skip to content

Commit 3e30199

Browse files
committed
Merge pull request halfrost#69 from Janetyu/janetyu
leetcode82 提供更多的解法
2 parents ec09c8d + 8ab50ac commit 3e30199

File tree

2 files changed

+147
-0
lines changed

2 files changed

+147
-0
lines changed

leetcode/0082.Remove-Duplicates-from-Sorted-List-II/82. Remove Duplicates from Sorted List II.go

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,3 +91,66 @@ func deleteDuplicates(head *ListNode) *ListNode {
9191
}
9292
return head
9393
}
94+
95+
// 双循环简单解法 O(n*m)
96+
func deleteDuplicates3(head *ListNode) *ListNode {
97+
if head == nil {
98+
return head
99+
}
100+
101+
nilNode := &ListNode{Val: 0, Next: head}
102+
head = nilNode
103+
104+
lastVal := 0
105+
for head.Next != nil && head.Next.Next != nil {
106+
if head.Next.Val == head.Next.Next.Val {
107+
lastVal = head.Next.Val
108+
for head.Next != nil && lastVal == head.Next.Val {
109+
head.Next = head.Next.Next
110+
}
111+
} else {
112+
head = head.Next
113+
}
114+
}
115+
return nilNode.Next
116+
}
117+
118+
// 双指针+删除标志位,单循环解法 O(n)
119+
func deleteDuplicates4(head *ListNode) *ListNode {
120+
if head == nil || head.Next == nil {
121+
return head
122+
}
123+
124+
nilNode := &ListNode{Val: 0, Next: head}
125+
// 上次遍历有删除操作的标志位
126+
lastIsDel := false
127+
// 虚拟空结点
128+
head = nilNode
129+
// 前后指针用于判断
130+
pre, back := head.Next, head.Next.Next
131+
// 每次只删除前面的一个重复的元素,留一个用于下次遍历判重
132+
// pre, back 指针的更新位置和值比较重要和巧妙
133+
for head.Next != nil && head.Next.Next != nil {
134+
if pre.Val != back.Val && lastIsDel {
135+
head.Next = head.Next.Next
136+
pre, back = head.Next, head.Next.Next
137+
lastIsDel = false
138+
continue
139+
}
140+
141+
if pre.Val == back.Val {
142+
head.Next = head.Next.Next
143+
pre, back = head.Next, head.Next.Next
144+
lastIsDel = true
145+
} else {
146+
head = head.Next
147+
pre, back = head.Next, head.Next.Next
148+
lastIsDel = false
149+
}
150+
}
151+
// 处理 [1,1] 这种删除还剩一个的情况
152+
if lastIsDel && head.Next != nil {
153+
head.Next = nil
154+
}
155+
return nilNode.Next
156+
}

website/content/ChapterFour/0082.Remove-Duplicates-from-Sorted-List-II.md

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ package leetcode
4343
* Next *ListNode
4444
* }
4545
*/
46+
47+
// 解法一
4648
func deleteDuplicates1(head *ListNode) *ListNode {
4749
if head == nil {
4850
return nil
@@ -89,6 +91,7 @@ func deleteDuplicates1(head *ListNode) *ListNode {
8991
return newHead.Next
9092
}
9193

94+
// 解法二
9295
func deleteDuplicates2(head *ListNode) *ListNode {
9396
if head == nil {
9497
return nil
@@ -103,4 +106,85 @@ func deleteDuplicates2(head *ListNode) *ListNode {
103106
return head
104107
}
105108

109+
func deleteDuplicates(head *ListNode) *ListNode {
110+
cur := head
111+
if head == nil {
112+
return nil
113+
}
114+
if head.Next == nil {
115+
return head
116+
}
117+
for cur.Next != nil {
118+
if cur.Next.Val == cur.Val {
119+
cur.Next = cur.Next.Next
120+
} else {
121+
cur = cur.Next
122+
}
123+
}
124+
return head
125+
}
126+
127+
// 解法三 双循环简单解法 O(n*m)
128+
func deleteDuplicates3(head *ListNode) *ListNode {
129+
if head == nil {
130+
return head
131+
}
132+
133+
nilNode := &ListNode{Val: 0, Next: head}
134+
head = nilNode
135+
136+
lastVal := 0
137+
for head.Next != nil && head.Next.Next != nil {
138+
if head.Next.Val == head.Next.Next.Val {
139+
lastVal = head.Next.Val
140+
for head.Next != nil && lastVal == head.Next.Val {
141+
head.Next = head.Next.Next
142+
}
143+
} else {
144+
head = head.Next
145+
}
146+
}
147+
return nilNode.Next
148+
}
149+
150+
// 解法四 双指针+删除标志位,单循环解法 O(n)
151+
func deleteDuplicates4(head *ListNode) *ListNode {
152+
if head == nil || head.Next == nil {
153+
return head
154+
}
155+
156+
nilNode := &ListNode{Val: 0, Next: head}
157+
// 上次遍历有删除操作的标志位
158+
lastIsDel := false
159+
// 虚拟空结点
160+
head = nilNode
161+
// 前后指针用于判断
162+
pre, back := head.Next, head.Next.Next
163+
// 每次只删除前面的一个重复的元素,留一个用于下次遍历判重
164+
// pre, back 指针的更新位置和值比较重要和巧妙
165+
for head.Next != nil && head.Next.Next != nil {
166+
if pre.Val != back.Val && lastIsDel {
167+
head.Next = head.Next.Next
168+
pre, back = head.Next, head.Next.Next
169+
lastIsDel = false
170+
continue
171+
}
172+
173+
if pre.Val == back.Val {
174+
head.Next = head.Next.Next
175+
pre, back = head.Next, head.Next.Next
176+
lastIsDel = true
177+
} else {
178+
head = head.Next
179+
pre, back = head.Next, head.Next.Next
180+
lastIsDel = false
181+
}
182+
}
183+
// 处理 [1,1] 这种删除还剩一个的情况
184+
if lastIsDel && head.Next != nil {
185+
head.Next = nil
186+
}
187+
return nilNode.Next
188+
}
189+
106190
```

0 commit comments

Comments
 (0)