每日一題——刪除排序鏈表中的重複項 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)

執行結果

遞歸法的執行結果

迭代法的執行結果

注意!不要被執行結果中內存消耗差異矇蔽了雙眼,進而懷疑對複雜度的分析是否正確,事實上,在測試數據集規模不夠的時候,執行結果的細微差異並不能說明問題。

學習 | 工作 | 分享

????長按關注“有理想的菜雞

只有你想不到,沒有你學不到

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