菜鸡每日一题系列打卡82天
每天一道算法题目
小伙伴们一起留言打卡
坚持就是胜利,我们一起努力!
题目描述(引自LeetCode)
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中没有重复出现的数字。
示例 1:
输入: 1->2->3->3->4->4->5
输出: 1->2->5
示例 2:
输入: 1->1->1->2->3
输出: 2->3
题目分析
这是一道链表的操作题目,在之前的题目中,菜鸡曾不止一次地提起过,链表是一种递归定义的数据结构,关于链表的操作题目,可以考虑采用递归法和迭代法两种方法进行实现。
有关链表操作的题目着实非常重要,也是面试过程中考查的热点,菜鸡在本文中将会采用两种方式进行实现,话不多说,上代码!
代码实现
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
// 递归
class Solution {
private ListNode tmp = null;
public ListNode deleteDuplicates(ListNode head) {
if (head==null || head.next==null) return head;
ListNode node = deleteDuplicates(head.next);
if (tmp == null) tmp = node;
if (tmp.val == head.val) {
return tmp.next;
} else {
head.next = node;
tmp = head;
return head;
}
}
}
// 迭代
class Solution {
public ListNode deleteDuplicates(ListNode head) {
if (head==null || head.next==null) return head;
ListNode dummy = new ListNode(-1);
dummy.next = head;
ListNode low = dummy, fast = head.next;
while (fast != null) {
if (low.next.val != fast.val) {
low = low.next;
fast = fast.next;
} else {
while (fast != null && low.next.val == fast.val) fast = fast.next;
low.next = fast;
if (fast != null) fast = fast.next;
}
}
return dummy.next;
}
}
代码分析
对代码进行分析:
在递归法的实现中,程序依然需要访问链表的所有结点,时间复杂度为O(n),由于递归调用需要额外的空间,空间复杂度为O(n)
在迭代法的实现中,程序对链表进行了遍历,时间复杂度为O(n),仅仅使用了常数级别的额外空间,因此,空间复杂度为O(1)
执行结果
递归法的执行结果
迭代法的执行结果
注意!不要被执行结果中内存消耗差异蒙蔽了双眼,进而怀疑对复杂度的分析是否正确,事实上,在测试数据集规模不够的时候,执行结果的细微差异并不能说明问题。
学习 | 工作 | 分享
????长按关注“有理想的菜鸡”
只有你想不到,没有你学不到