题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
时间限制:1秒 空间限制:32768K
解题思路
1、使用ArrayList
先将第一个结点加入ArrayList,并且使用flag标记ArrayList中的当前结点是否重复
再在循环中,检测是否存在重复结点:相同时置为true,否则加入ArrayList中
最后,需要判断ArrayList是否为空,并且要将最后一个结点的next设为null
import java.util.ArrayList;
public class Solution {
public ListNode deleteDuplication(ListNode pHead)
{
if(pHead==null) return null;
ArrayList<ListNode> array=new ArrayList<>();
array.add(pHead);
pHead=pHead.next;
boolean flag=false;
int index=0;
while(pHead!=null){
if(array.get(index).val==pHead.val) flag=true;
else{
if(flag) array.remove(index);
else index++;
array.add(pHead);
flag=false;
}
pHead=pHead.next;
}
if(flag) array.remove(index);
if(array.size()==0) return null;
for(int i=1;i<array.size();i++){
array.get(i-1).next=array.get(i);
}
array.get(array.size()-1).next=null;//这一句尤为重要!
return array.get(0);
}
}
2、使用递归
public class Solution {
public ListNode deleteDuplication(ListNode pHead)
{
if(pHead==null||pHead.next==null) return pHead;
if(pHead.val==pHead.next.val){
ListNode node=pHead.next;
//跳过与当前结点相同的节点
while(node.next!=null&&node.val==node.next.val) node=node.next;
return deleteDuplication(node.next);
}else{
pHead.next=deleteDuplication(pHead.next);
return pHead;
}
}
}