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

目录

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

题目的接口:

解题思路:

代码:

过啦!!!

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

题目的接口:

解题思路:

代码:

过啦!!!

写在最后:


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

【面试必刷TOP101】 删除有序链表中重复的元素-I & 删除有序链表中重复的元素-II_第1张图片

题目的接口:

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
}

过啦!!!

【面试必刷TOP101】 删除有序链表中重复的元素-I & 删除有序链表中重复的元素-II_第2张图片

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

【面试必刷TOP101】 删除有序链表中重复的元素-I & 删除有序链表中重复的元素-II_第3张图片

题目的接口:

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
}

过啦!!!

【面试必刷TOP101】 删除有序链表中重复的元素-I & 删除有序链表中重复的元素-II_第4张图片

写在最后:

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

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

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

你可能感兴趣的:(牛客面试必刷,TOP101,面试,算法,数据结构)