Leetcode 第 83. Remove Duplicates from Sorted List 题,题目难度 Easy。
一.题目要求
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
示例 1:
输入: 1->1->2
输出: 1->2
示例 2:
输入: 1->1->2->3->3
输出: 1->2->3
二. 解题思路 & 代码
基本思路就是遍历整个链表,然后对每一个 Node 的 value 进行判断。
解法 1:遍历链表 & 构建新链表
遍历链表时,每个节点作为结果链表中的一个节点,判断当前 Node 的 val 是否等于结果集中最后一个 node 的 val 即可。
实现代码如下:
public class Solution {
public ListNode deleteDuplicates(ListNode head) {
if (head == null) {
return head;
}
// 结果链表
ListNode result = new ListNode(head.val);
ListNode tailNode = result;
while (head.next != null) {
head = head.next;
// 如果不相等,加入结果集
if (head.val != tailNode.val) {
ListNode nextNode = new ListNode((head.val));
tailNode.next = nextNode;
tailNode = nextNode;
}
}
return result;
}
}
每次执行都要有两次判断操作,其时间复杂度是 O(n)。运行两次结果是 Runtime: 0 ms, faster than 100.00% 和 Runtime: 1 ms, faster than 23.39% of Java,看结果大都在 0 ~ 2 ms 之内,因此代码性能没啥问题。
解法 2:遍历链表,就地变换
上面实现方式是通过新建 Node 的方式,利用符合条件的 Node 的 val 来创建新的链表进行返回,还可以直接在链表本身进行操作,这样可以提升时间和空间复杂度:。
实现代码如下:
public class Solution {
public ListNode deleteDuplicates(ListNode head) {
if (head == null) {
return head;
}
ListNode next = head.next;
ListNode tmp = head;
while (next != null) {
if (next.val != tmp.val) {
tmp.next = next;
tmp = tmp.next;
}
next = next.next;
}
tmp.next = null;
return head;
}
}
上面两段代码执行的结果性能差不多,不过第二种省去了对象创建的过程,相对来说空间和时间性能上还是会好一些的。
老铁,都看到这了来一波点赞、评论、关注三连可好
我是 AhriJ邹同学,前后端、小程序、DevOps 都搞的炸栈工程师。博客持续更新,如果觉得写的不错,欢迎来一波老铁三连,不好的话也欢迎指正,互相学习,共同进步。