首页 > 试题广场 >

删除有序链表中重复的元素-II

[编程题]删除有序链表中重复的元素-II
  • 热度指数:178120 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给出一个升序排序的链表,删除链表中的所有重复出现的元素,只保留原链表中只出现一次的元素。
例如:
给出的链表为, 返回.
给出的链表为, 返回.

数据范围:链表长度 ,链表中的值满足
要求:空间复杂度 ,时间复杂度
进阶:空间复杂度 ,时间复杂度
示例1

输入

{1,2,2}

输出

{1}
示例2

输入

{}

输出

{}

说明:本题目包含复杂数据结构ListNode,点此查看相关信息
function deleteDuplicates( head ) {
   let map = new Map()
   let p = head
   while(p){
       if(!map.has(p.val)){
           map.set(p.val,1)
       }else{
           let tmp = map.get(p.val)
           tmp++
           map.set(p.val,tmp)
       }
       p = p.next
   }
   let node = new ListNode(0)
   node.next = head  
   let cur = node
   while(cur.next !== null){
       if(map.get(cur.next.val) !== 1){
           cur.next = cur.next.next
       }else{
           cur = cur.next
       }
   }
   return node.next
}v

发表于 2022-11-03 20:23:38 回复(0)
// 思路:当前节点值跟上个节点和下个节点都不重复的时候,就是符合要求的
function deleteDuplicates( head ) {
    // write code here
    let newHead = null
    let newPre = null
    let cur = head
    let preVal = null
    while (cur) {
        const next = cur.next
        if (cur.val !== preVal && (!next || next.val !== cur.val)) {
            const node = {
                val: cur.val,
                next: null
            }
            if (newPre === null) {
                newHead = node
                newPre = node
            } else {
                newPre.next = node
                newPre = node
            }
        }
        preVal = cur.val
        cur = next
    }
    return newHead
}

发表于 2021-11-18 16:38:10 回复(0)