菜雞每日一題系列打卡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)
執行結果
遞歸法的執行結果
迭代法的執行結果
注意!不要被執行結果中內存消耗差異矇蔽了雙眼,進而懷疑對複雜度的分析是否正確,事實上,在測試數據集規模不夠的時候,執行結果的細微差異並不能說明問題。
學習 | 工作 | 分享
????長按關注“有理想的菜雞”
只有你想不到,沒有你學不到