@@ -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+ }
0 commit comments