@@ -91,3 +91,66 @@ func deleteDuplicates(head *ListNode) *ListNode {
91
91
}
92
92
return head
93
93
}
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
+ }
0 commit comments