借助哑节点+map,遍历两次链表即可:

ps: 做的时候没看到这是个升序序列,升序序列直接用指针进行断链、删除、合并操作即可

//
// Created by jt on 2020/9/24.
//
#include <unordered_map>
using namespace std;


class Solution {
public:
    /**
     *
     * @param head ListNode类
     * @return ListNode类
     */
    ListNode* deleteDuplicates(ListNode* head) {
        // write code here
        ListNode *p = head;
        ListNode dummy(0);
        ListNode *q = &dummy;
        unordered_map<int, int> mp;
        // 第一次遍历,记录各元素出现次数
        while (p) {
            ++mp[p->val];
            p = p->next;
        }
        // 第二次遍历,删除重复节点
        p = head;
        while (p) {
            if (mp[p->val] > 1) {
                ListNode *tmp = p->next;
                delete p;
                p = tmp;
            } else {
                q->next = p;
                q = p;
                p = p->next;
            }
        }
        q->next = nullptr;
        return dummy.next;
    }
};