1836 从未排序的链表中移除重复元素-中等
题目:
给定一个链表的第一个节点 head
,找到链表中所有出现多于一次的元素,并删除这些元素所在的节点。
返回删除后的链表。
输入: head = [1,2,3,2] 输出: [1,3] 解释: 2 在链表中出现了两次,所以所有的 2 都需要被删除。删除了所有的 2 之后,我们还剩下 [1,3] 。
解题思路
这道题的要求是把出现次数大于1次的节点都去掉,并保持原节点的相对位置不变。
一种思路是借助 map 记录节点出现的次数,详见解法1。
具体是第一次遍历,把节点的值存入 map,记录次数;第二次遍历,借助哑结点把出现次数为1的节点加入哑结点所在的链表,最后返回哑结点的链表。这个解法有个优化点,就是第一次遍历的时候,后面重复的节点可以先删除,以便第二次连接的时候少操作一部分。
// date 2024/01/12
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
// 解法1
func deleteDuplicatesUnsorted(head *ListNode) *ListNode {
cnt := make(map[int]int, 4)
cur := head
prev := head
for cur != nil {
cnt[cur.Val]++
// 优化1: 遍历的同时直接去掉后面出现的 重复的
if cnt[cur.Val] > 1 && cur.Next != nil {
prev.Next = cur.Next
}
prev = cur
cur = cur.Next
}
dummy := &ListNode{}
pre := dummy
cur = head
for cur != nil {
if cnt[cur.Val] == 1 {
pre.Next = cur
pre = cur
}
cur = cur.Next
}
pre.Next = nil
return dummy.Next
}
最后更新于