[LeetCode题解]Leetcode82.删除排序链表中的重复元素II

74 阅读1分钟

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

原题链接

存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现的数字。 返回同样按升序排列的结果链表。

题解

遍历:时间复杂度 O(n)O(n)

这道题目借鉴到了双指针算法的思想,我们先找到一个结点 pp,然后找到 pp的下一个节点和下下一个节点 qq,作为双指针进行比较,如果他们的值相同,则qq向后移动一位。找到相同节点的链表长度,若大于1则删除。

代码

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        ListNode dummy = new ListNode(-1);
        dummy.next = head;
        ListNode p = dummy;

        while (p.next != null) {
            ListNode q = p.next.next;
            while (q != null && q.val == p.next.val) q = q.next;
            if (p.next.next == q) p = p.next;
            else p.next = q;
        }
        return dummy.next;
    } 
}