【面试必刷TOP101】 删除有序链表中重复的元素-I & 删除有序链表中重复的元素-II

简介: 【面试必刷TOP101】 删除有序链表中重复的元素-I & 删除有序链表中重复的元素-II

题目:删除有序链表中重复的元素-I_牛客题霸_牛客网 (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
}

过啦!!!

题目:删除有序链表中重复的元素-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
}

解题思路:

这道题和上一题很像,但是难度更高,他的边界问题更多,核心的部分就是怎么把重复的数字那部分给删除掉,

如果没出现重复的数字,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
}

过啦!!!

写在最后:

以上就是本篇文章的内容了,感谢你的阅读。

如果感到有所收获的话可以给博主点一个哦。

如果文章内容有遗漏或者错误的地方欢迎私信博主或者在评论区指出~

相关文章
|
2月前
|
算法
LeetCode刷题---21.合并两个有序链表(双指针)
LeetCode刷题---21.合并两个有序链表(双指针)
|
3月前
|
Java
Java移除链表元素
Java移除链表元素
30 0
|
3月前
|
NoSQL Redis 数据库
面试02-Redis 中的过期元素是如何被处理的?
面试02-Redis 中的过期元素是如何被处理的?
58 0
【移除链表元素】LeetCode第203题讲解
【移除链表元素】LeetCode第203题讲解
|
3月前
|
存储 算法
头歌:第1关:有序单链表的插入操作
头歌:第1关:有序单链表的插入操作
130 0
|
3天前
leetcode代码记录(移除链表元素
leetcode代码记录(移除链表元素
9 0
|
17天前
|
存储
三种方法实现获取链表中的倒数第n个元素
三种方法实现获取链表中的倒数第n个元素
14 0
|
26天前
【力扣】83. 删除排序链表中的重复元素、82. 删除排序链表中的重复元素Ⅱ
【力扣】83. 删除排序链表中的重复元素、82. 删除排序链表中的重复元素Ⅱ
|
26天前
【力扣】21. 合并两个有序链表
【力扣】21. 合并两个有序链表
|
1月前
|
存储 算法
[经典面试题]169. 多数元素
[经典面试题]169. 多数元素