✍️【每日一题】Go题解 6.删除排序链表中的重复元素|Go主题月

252 阅读2分钟

个人评价:经过昨日中等类似题的洗礼,这题秒解啊哈哈

题目难度:🌟 (参考 LeeCode 简单🌟 、中等🌟 🌟 、困难🌟 🌟 🌟 )

另,通常算法题会考察分析时间复杂度和空间复杂度,可参考笔者之前的文章

「数据结构&算法」必知必会系列:3. 时间 & 空间复杂度(下)

链表可回炉:「数据结构&算法」必知必会系列:7. 常见数据结构——链表(下)

删除排序链表中的重复元素

题目描述

83. 删除排序链表中的重复元素

存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 。

返回同样按升序排列的结果链表。

示例 1:

输入:head = [1,1,2]

输出:[1,2]

示例 2:

输入:head = [1,1,2,3,3]

输出:[1,2,3]

提示:

链表中节点数目在范围 [0, 300] 内 -100 <= Node.val <= 100 题目数据保证链表已经按升序排列

解题思路

跟昨日的每日一题比,简直小巫见大巫,思路类似,操作简化~

采用遍历 + 引入哨兵,思路如下:

  • 当前值与之后的值对比,不同 =》继续(已经排序,可确定唯一)
  • 当前值与之后的值对比,相同 =》删除当前结点,继续循环判断
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func deleteDuplicates(head *ListNode) *ListNode {
    if head == nil {
        return nil
    }
    dummy := &ListNode{0, head} // 引入 哨兵节点/哑结点 减少头结点删除的难度
    cur := dummy.Next
    for cur.Next != nil {
        if cur.Val == cur.Next.Val {
            *cur = *cur.Next // 非尾结点的删除,直接指针指向改变即可
        } else {
            cur = cur.Next
        }
    }
    return dummy.Next
}

总结

排序链表的基础去重操作,应该很顺手就写出来,白板也可~