408算法练习——删除有序链表中的重复元素
删除重复元素
题目链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii/
一、问题描述
存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。返回同样按升序排列的结果链表。
示例 1:

输入:head = [1,2,3,3,4,4,5]
输出:[1,2,5]
示例 2:

输入:head = [1,1,1,2,3]
输出:[2,3]
提示:
链表中节点数目在范围 [0, 300] 内
-100 <= Node.val <= 100
题目数据保证链表已经按升序排列
二、问题分析
首先想到的是双指针,通过双指针把重复元素的区域划分出来,然后重新连接链表,并跳过被划分出的区域
三、算法设计
需要两个指针,指针i总是指向重复区域的前一个位置,指针j指向重复区域的最后一个元素,这样i.next和j就对应重复区域的边界
1 /** 2 * Definition for singly-linked list. 3 * public class ListNode { 4 * int val; 5 * ListNode next; 6 * ListNode() {} 7 * ListNode(int val) { this.val = val; } 8 * ListNode(int val, ListNode next) { this.val = val; this.next = next; } 9 * } 10 */ 11 class Solution { 12 public ListNode deleteDuplicates(ListNode head) { 13 if(head==null){ 14 return head; 15 } 16 ListNode nhead = new ListNode(); 17 nhead.next=head; 18 ListNode i=nhead; 19 ListNode j=i.next; 20 while(j.next!=null){ 21 if(i.next.val != j.next.val){ 22 i = i.next; 23 j = j.next; 24 }else{//如果等于说明有重复元素,找出重复区间并跳过 25 while(i.next.val == j.val && j.next!=null){ 26 j = j.next; 27 } 28 if(j.next == null && i.next.val == j.val){//j是链表最后一个元素且j也是重复元素 29 i.next = null; 30 }else { 31 i.next = j; 32 33 } 34 } 35 } 36 return nhead.next; 37 } 38 }

浙公网安备 33010602011771号