每日一题——删除排序链表中的重复项 II

菜鸡每日一题系列打卡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)

执行结果

递归法的执行结果

迭代法的执行结果

注意!不要被执行结果中内存消耗差异蒙蔽了双眼,进而怀疑对复杂度的分析是否正确,事实上,在测试数据集规模不够的时候,执行结果的细微差异并不能说明问题。

学习 | 工作 | 分享

????长按关注“有理想的菜鸡

只有你想不到,没有你学不到

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章