题目
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留。
样例1
输入:1->2->3->3->4->4->5
输出:1->2->5
样例2
输入:1->1->1->2->3
输出:2->3
算法
(线性扫描) O(n)
为了方便处理边界情况,我们定义一个虚拟元素 dummy 指向链表头节点。
然后从前往后扫描整个链表,每次扫描元素相同的一段,如果这段中的元素个数多于1个,则将整段元素直接删除。
时间复杂度
整个链表只扫描一遍,所以时间复杂度是 O(n)。
class Solution {
public ListNode deleteDuplication(ListNode head) {
ListNode virtual = new ListNode(-1);
virtual.next = head;
ListNode p = virtual;
while(p.next != null){
ListNode q = p.next;
//找出相同的元素段
while(q!=null && p.next.val == q.val) q = q.next;
//ListNode q = p.next 如果p.next.next == q
//说明这个区间没有重复的元素
if(p.next.next == q) p = p.next;
//反之,直接令p.next指向q,去除重复元素
else p.next = q;
}
return virtual.next;
}
}