LeetCode 82 . 删除排序链表中的重复元素 II

题目描述:给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。

题目链接

思路一:使用哑结点和快慢指针,快指针用于跳过重复的数组,慢指针用于和快指针拼接。

class Solution {
        public ListNode deleteDuplicates(ListNode head) {
        if (head == null) 
            return head;
        ListNode dummy = new ListNode(-1000);
        dummy.next = head;
        ListNode slow = dummy;
        ListNode fast = dummy.next;
        while (fast != null) {
            while (fast.next != null && fast.val == fast.next.val) 
                fast = fast.next;
            // 如果快、慢指针之间没有重复数组,则统一往后移动
            if (slow.next == fast) 
                slow = slow.next;
            // 如果之间存在重复数组,那么慢指针和快指针(当前指向的是重复数字)进行拼接
            else
                slow.next = fast.next;
            fast = fast.next;
        }
        return dummy.next;
    }
}

思路二:使用一个新的节点,用于拼接没有重复数字的节点,遍历链表count用来记录,如果超过1,那么就跳过,如果等于1,该节点拼接。

class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        ListNode p1 = head;
        ListNode p2 = new ListNode(0);
        ListNode Head = p2;
        ListNode temp = null;
        int count,value;
        while(p1 != null) {
            temp = p1; 
            count = 0;
            value = p1.val;
            while(p1 != null && p1.val == value) {
                ++count;
                p1 = p1.next;
            }
            if(count == 1) {
                p2.next = temp;
                p2 = temp;
            }
        }
        p2.next = null;
        return Head.next;
    }
}
发布了120 篇原创文章 · 获赞 16 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43327091/article/details/102806935