其他分享
首页 > 其他分享> > Leetcode83. 删除排序链表中的重复元素

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

作者:互联网

题目

存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 。返回同样按升序排列的结果链表。

在这里插入图片描述
在这里插入图片描述
思路:一边遍历一边比较,设置两个节点指针。如果val值一样,我们就让temp2后移直到val值不一样,然后temp1.next直接指向temp2即可。最后直到temp2为空即可。

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)
在这里插入图片描述

标签:null,ListNode,Leetcode83,next,链表,temp2,temp1,排序
来源: https://blog.csdn.net/qq_46316607/article/details/116545826