在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5。
思路
本题特殊之处在于:
(1)重复结点不保留,即全部删除;这就需要使用时间复杂度为O(1)的删除结点的解法。
(2)重复的结点是排序好的,可能不止两个。刚开始想的解法是计数有几个重复的结点,后面发现使用复制值的方式直接可以通过重复点的首末位置就可以了,不需要计数。
(3)几种特殊情况的考虑:
1)空结点输入;
2)输入结点全相同,{1,1,1,1,1};
3)尾部几个元素是相同的,需要删除,但是其next结点为null,需要重新遍历。这里还是有点模糊,就是在这个地方的头结点
是否还是最初的头结点,还是改变之后的头结点。
解法1
nowcoder
提交时间:2020-01-03 ,语言:Java ,运行时间: 39 ms, 占用内存:9284K ,状态:答案正确
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public ListNode deleteDuplication(ListNode pHead){
ListNode node=pHead;
//boundary
if(pHead==null){
return null;
}
if(pHead.next==null){
return pHead;
}
while(node.next!=null){
if(node.val==node.next.val){
// dup element start post, node1
ListNode node1=node;
while(node.val==node.next.val && node.next!=null){
node=node.next;
//can reslove the all element are same,{1,1,1,1}
if(node.next==null && node.val==pHead.val){
return null;
}
//{4,5,5},last ,specile situation
if(node.next==null){
ListNode node2=pHead;
while(node2.next!=node1){
node2=node2.next;
}
node2.next=null;
return pHead;
}
}
node1.val=node.next.val;
node1.next=node.next.next;
node=node1;
}else{
node=node.next;
}
}
return pHead;
}
}
解法2
链接:https://www.nowcoder.com/questionTerminal/fc533c45b73a41b0b44ccba763f866ef?f=discussion
来源:牛客网
if (pHead==null || pHead.next==null){
return pHead;
}
ListNode Head = new ListNode(0);
Head.next = pHead;
ListNode pre = Head;
ListNode last = Head.next;
while (last!=null){
if(last.next!=null && last.val == last.next.val){
// 找到最后的一个相同节点
while (last.next!=null && last.val == last.next.val){
last = last.next;
}
pre.next = last.next;
last = last.next;
}else{
pre = pre.next;
last = last.next;
}
}
return Head.next;