Leetcode82. 删除排序链表中的重复元素 II

题目

存在一个按升序排列的链表,给你这个链表的头节点 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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值