BM16. [删除有序链表中重复的元素-II]

https://www.nowcoder.com/exam/oj?tab=%E7%AE%97%E6%B3%95%E7%AF%87&topicId=295
BM16. 删除有序链表中重复的元素-II
题目分析
首先根据这个题目中所有重复的元素都不保留,所以必须要有一个pre节点存在。然后问题分解,逐个击破。本题就会分解成为5个步骤。
建立伪节点dummy,所以直接就能确定结果的返回
public ListNode deleteDuplicates (ListNode head) {
if(head == null)
return head;
ListNode dummy = new ListNode(-1);
return dummy.next;
}
然后伪节点的“遍历连接节点”pre用来构建连接结果,另外记住pre的next节点就是head节点,还要一个“遍历当前节点”cur
ListNode pre = dummy; pre.next = head; ListNode cur = head;
遍历当前节点
while(cur != null){
}
那么当前的节点就可能是重复的值,判断当前节点是不是重复的值,那么就需要知道当前节点的下一个节点。知道下一个节点之后就可以判断重复,对重复的节点进行一网打尽。打尽之后就进行节点连接,跳过那些重复的值;
int mayRepeatValue = cur.val;
ListNode next = cur.next;
if(next != null && next.val == mayRepeatValue){
while(next != null && next.val == mayRepeatValue){
next = next.next;
}
cur = next;
pre.next = cur;
}
不需要一网打尽的,就要对你的遍历指针赋值右移动。这样也是2步骤中为什么要构造pre.next是head的原因
else{
pre = cur;
cur = next;
}
完整题解
public ListNode deleteDuplicates (ListNode head) {
if(head == null)
return head;
ListNode dummy = new ListNode(-1);
dummy.next = head;
ListNode pre = dummy;
ListNode cur = head;
while(cur != null){
//重复的元素
int mayRepeatValue = cur.val;
ListNode next = cur.next;
if(next != null && next.val == mayRepeatValue){
//找到一个不重复的next节点
while(next != null && next.val == mayRepeatValue){
next = next.next;
}
cur = next;
pre.next = cur;
}else{
pre = cur;
cur = next;
}
}
return dummy.next;
}
复杂度分析
- 时间复杂度:
,
为链表的长度
- 空间复杂度:
,没有使用新的额外空间

查看11道真题和解析
上海得物信息集团有限公司公司福利 1164人发布
