个人评价:经过昨日中等类似题的洗礼,这题秒解啊哈哈
题目难度:🌟 (参考 LeeCode 简单🌟 、中等🌟 🌟 、困难🌟 🌟 🌟 )
另,通常算法题会考察分析时间复杂度和空间复杂度,可参考笔者之前的文章
删除排序链表中的重复元素
题目描述
存在一个按升序排列的链表,给你这个链表的头节点 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
}
总结
排序链表的基础去重操作,应该很顺手就写出来,白板也可~