目录
题目:删除有序链表中重复的元素-I_牛客题霸_牛客网 (nowcoder.com)
题目:删除有序链表中重复的元素-II_牛客题霸_牛客网 (nowcoder.com)

- package main
- import . "nc_tools"
- /*
- * type ListNode struct{
- * Val int
- * Next *ListNode
- * }
- */
-
- /**
- * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
- *
- *
- * @param head ListNode类
- * @return ListNode类
- */
- func deleteDuplicates( head *ListNode ) *ListNode {
- // write code here
- }
说实话,遇到这种题目我的第一个反应就是马上把链表里的数存进一个数据结构帮我去重,在 C++ 我用的 set 去重,现在用 Golang 了我就可以用 map 来去重,
代码肯定是可以通过的,但是题目要求的时间复杂度是 O(N),这样子实际上是不符合要求的,所以还是得想一个算法来解决这个问题,
好消息是,这是一个有序的链表,所以我们直接遍历,遇到相同的数字就直接删除
- package main
-
- import . "nc_tools"
-
- /*
- * type ListNode struct{
- * Val int
- * Next *ListNode
- * }
- */
-
- /**
- * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
- *
- *
- * @param head ListNode类
- * @return ListNode类
- */
- func deleteDuplicates( head *ListNode ) *ListNode {
- cur := head
- pre := head
- for cur != nil {
- tmp := cur.Val
- cur = cur.Next
- for cur != nil && tmp == cur.Val { // 如果相等就删除节点
- cur = cur.Next
- pre.Next = cur
- }
- pre = cur
- }
- return head
- }


- package main
- import . "nc_tools"
- /*
- * type ListNode struct{
- * Val int
- * Next *ListNode
- * }
- */
-
- /**
- * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
- *
- *
- * @param head ListNode类
- * @return ListNode类
- */
- func deleteDuplicates( head *ListNode ) *ListNode {
- // write code here
- }
这道题和上一题很像,但是难度更高,他的边界问题更多,核心的部分就是怎么把重复的数字那部分给删除掉,
如果没出现重复的数字,cur 和 prev 两个指针就继续往前遍历,如果遇到重复的数字就删掉这段数字,通过 continue 再把 cur 和 prev 之间的位置调整好,代码如下:
- package main
-
- import . "nc_tools"
-
- /*
- * type ListNode struct{
- * Val int
- * Next *ListNode
- * }
- */
-
- /**
- * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
- *
- *
- * @param head ListNode类
- * @return ListNode类
- */
- func deleteDuplicates(head *ListNode) *ListNode {
- if head == nil {
- return nil
- }
- h := &ListNode{Next: head}
- prev, cur := h, head.Next
- for prev.Next != nil && prev.Next.Next != nil && cur != nil {
- cur = prev.Next.Next
- if prev.Next.Val == cur.Val { // 删除重复数字的逻辑
- for cur != nil && prev.Next.Val == cur.Val {
- cur = cur.Next
- }
- prev.Next = cur
- continue
- }
-
- prev = prev.Next
- cur = cur.Next
- }
-
- return h.Next
- }

以上就是本篇文章的内容了,感谢你的阅读。
如果感到有所收获的话可以给博主点一个赞哦。
如果文章内容有遗漏或者错误的地方欢迎私信博主或者在评论区指出~