题目
存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。
返回同样按升序排列的结果链表。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:这题和83题的删除重复节点不同的是,83题会保留一个重复的元素,而此题不会。思路也很简单,由于是升序链表,所以重复的节点值一定是扎堆存在的,所以我们只要判断此节点的后继是否和当前节点值相等,如果相等,就继续遍历,直到找到和这个节点不相等的节点值。
public class Leetcode83 {
public ListNode deleteDuplicates(ListNode head) {
// 定义一个带头节点的新链表
ListNode list1 = new ListNode(0,head);
// temp1指向原链表的第一个节点
ListNode temp1 = list1.next;
// 如果temp1为空,那说明原链表是空的,直接返回即可
if(temp1 == null){return head;}
// temp2为temp1后面的那个节点
ListNode temp2 = temp1.next;
// 只要temp2不为空,我们就一直执行
while (temp2!=null){
// 如果temp2的val 和 temp1的val相等 我们就往后移动temp2
// 如果temp2是最后一个元素,那temp2.next会造成空指针异常
// 所以这里要加一个temp2!=null
while (temp2!=null && temp2.val == temp1.val){
temp2 = temp2.next;
}
// 当退出这个while循环时,有二种情况
/*
1.temp2为空
2.temp2不为空,但值不相等
*/
// 如果是第一种情况,我们就认为遍历结束了,直接让temp1指向null就行。
// 这里解释一下,遍历结束有可能是相等的,比如最后是3,3。当然也有可能不相等
// 但无论怎么样,让temp1最终都是指向null的
if(temp2 == null){
temp1.next = null;
break;
}else {
// 如果是第二种情况,说明遍历还没结束,也就是找到了不等于temp1.val的temp2
// 这时候 我们把temp1的next指向temp2并且更新两者即可;
temp1.next = temp2;
temp1 = temp2;
temp2 = temp1.next;
}
}
// 最后 去掉头节点返回
ListNode result = list1.next;
return result;
}
}
只遍历一次,所以时间复杂度为O(n)