题目
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
牛客网给定以下链表类。
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
*/
分析
思路一:
要删除重复的结点,可以遍历当前结点的下一结点和下下一个结点,如果发现值相同,就将当前结点指向之后不重复的结点,如此接着继续判断,直到没有重复的结点。此处需要注意如果是头结点重复的情况,所以我们需建一个新结点,将其指向pHead。具体思路见代码。
时间复杂度:o(N)
空间复杂度:o(1)
代码:
public class Solution {
public ListNode deleteDuplication(ListNode pHead)
{
//首先判断异常输入(输入为空指针)情况
if(pHead==null) return null;
//新建一个头指针,其指向pHead,防止头结点重复的情况
ListNode first = new ListNode(-1);
first.next = pHead;
ListNode cur = first;
//遍历链表
while(cur.next!=null && cur.next.next!=null){
if(cur.next.val==cur.next.next.val){
while(cur.next.next!=null && cur.next.val==cur.next.next.val){
cur.next = cur.next.next; //删除中间多余的重复结点
}
cur.next = cur.next.next; //删除最后一个多余的重复结点
} else{
cur = cur.next;
}
}
return first.next;
}
}