提供一种比较简单的解法,大致思路:链表是排序的,根据val值不同可把链表分为一个个小区间,每个小区间的第一个元素设定为锚点(anchor),那么如果把那些只出现一次的锚点重新连接成为链表就得到了最终结果。

public ListNode deleteDuplication(ListNode pHead) {
        if (pHead == null)
            return null;
        // 新链表的头结点,可以不用判空
        ListNode firstAnchor = new ListNode(0);
        // 指向新链表的最后一个节点
        ListNode preAnchor = firstAnchor;
        // anchor指向不同val区间的第一个节点,iterator用于遍历链表
        ListNode anchor = pHead, iterator = pHead;
        while (iterator != null) {
            // 此循环用于遍历子区间,loop记录区间节点个数
            int loop = 0;
            while (iterator != null && iterator.val == anchor.val) {
                iterator = iterator.next;
                ++loop;
            }
            // 如果区间中仅有一个节点,则添加到新链表中
            if (loop == 1) {
                preAnchor.next = anchor;
                preAnchor = anchor;
                preAnchor.next = null;
            }
            // 前面的循环结束后,iterator刚好指向下一个anchor的位置
            anchor = iterator;
        }
        return firstAnchor.next;
}