描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表 1->2->3->3->4->4->5 处理后为 1->2->5
数据范围:链表长度满足 ,链表中的值满足
进阶:空间复杂度 ,时间复杂度
例如输入{1,2,3,3,4,4,5}时,对应的输出为{1,2,5},对应的输入输出链表如下图所示:
示例1
输入:{1,2,3,3,4,4,5}
返回值:{1,2,5}
示例2
输入:{1,1,1,8}
返回值:{8}
第一种解法
此类题目,肯定是可以采用递归来解决的,递归循环找到每个不重复的节点,重新组成一个有序链表即可,代码如下
public ListNode firstdeleteDuplication(ListNode<Integer> pHead) {
if(null == pHead || null == pHead.next){
return pHead;
}
if(pHead.val == pHead.next.val){
ListNode node = pHead.next;
//找到下一个phead不相同的第一个节点
while (node != null && node.val == pHead.val ){
node = node.next;
}
return firstdeleteDuplication(node);
}else {
pHead.next =firstdeleteDuplication(pHead.next);
return pHead;
}
}
第二个解法
在第一种解法中,我们采用了递归的方式,我们也可以采用非递归的方式,直接循环判断,代码如下
public ListNode secondDeleteDuplication(ListNode<Integer> pHead) {
if(null == pHead || null == pHead.next){
return pHead;
}
//定义一个虚拟头节点
if(pHead == null || pHead.next == null) return pHead;
ListNode temp = new ListNode(-1);
temp.next = pHead;
ListNode pre = temp;
while(pHead != null && pHead.next != null){
ListNode next = pHead.next;
if(pHead.val == next.val){
while(next != null && pHead.val == next.val){
next = next.next;
}
pre.next = next;
pHead = next;
}else{
pre = pHead;
pHead = pHead.next;
}
}
return temp.next;
}