82. Remove Duplicates from Sorted List II

来源:互联网 发布:徐州网络跳骚市场 编辑:程序博客网 时间:2024/05/21 14:00

Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.

For example,
Given 1->2->3->3->4->4->5, return 1->2->5.
Given 1->1->1->2->3, return 2->3.

移除重复出现的元素、

思路1:建立一个map,key为node的节点值,val为该值出现的次数,先扫描整个链表,建立map;再重新扫描链表,同时判断该值出现的次数,如果为1,则加入返回的链表中,否则不添加。该思路的空间复杂度为O(n),时间复杂度为O(n)。

思路2:直接在原始链表上做调整,通过一个pre指向当前节点的前置指点,在判断该节点是否只出现一次,程序如下所示:

/** * Definition for singly-linked list. * public class ListNode { *     int val; *     ListNode next; *     ListNode(int x) { val = x; } * } */class Solution {    public ListNode deleteDuplicates(ListNode head) {        ListNode tmp = null;        if (head != null){            tmp = new ListNode(head.val);        }        else {            return tmp;        }        if (head.next == null){            return head;        }        ListNode ret = tmp, pre = head;        head = head.next;        boolean tag = false;        while (head != null){            if (head.val == pre.val){                tag = true;            }            else {                if (!tag){                    tmp.next = pre;                    tmp = tmp.next;                }                tag = false;            }            pre = head;            head = head.next;        }        tmp.next = tag?null:pre;        return ret.next;    }}