c++算法進(jìn)階刪除有序鏈表中的重復(fù)元素
題目
給出一個升序排序的鏈表,刪除鏈表中的所有重復(fù)出現(xiàn)的元素,只保留原鏈表中只出現(xiàn)一次的元素。
例如:
給出的鏈表為1→2→3→3→4→4→5, 返回1→2→5。
給出的鏈表為1→1→1→2→3, 返回2→3。
數(shù)據(jù)范圍:鏈表長度0≤n≤10000,鏈表中的值滿足∣val∣≤1000
要求:空間復(fù)雜度O(n),時間復(fù)雜度O(n)
進(jìn)階:空間復(fù)雜度O(1),時間復(fù)雜度O(n)
示例
示例1
輸入: {1,2,2} 返回值: {1}
示例2
輸入: {} 返回值: {}
思路
因為是升序的鏈表,重復(fù)的元素時連在一起的,所以可以連續(xù)的跳過相同的節(jié)點(diǎn)。
這里有個小技巧:因為鏈表有可能前幾個元素就是重復(fù)的,這時就需要刪除頭指針了,所以我們需要給鏈表增加一個自定義的表頭,以方便后面刪除了原來的頭指針而找不到表頭,還有需要注意的就是在返回的時候要去掉增加的表頭。
這種解法的空間復(fù)雜度是O(1),另外也可以通過哈希表unordered_map來記錄每個節(jié)點(diǎn)值出現(xiàn)的次數(shù)來解決這個問題。哈希表的方式空間復(fù)雜度就是O(n)了,如果鏈表的無序的,則哈希表的解決方法更通用。
解答代碼
/** * struct ListNode { * int val; * struct ListNode *next; * ListNode(int x) : val(x), next(nullptr) {} * }; */ class Solution { public: /** * @param head ListNode類 * @return ListNode類 */ ListNode* deleteDuplicates(ListNode* head) { // write code here if (head == nullptr) { return nullptr; } // 給鏈表增加一個表頭,以便可以刪除原鏈表的頭結(jié)點(diǎn)。 auto res = new ListNode(0); res->next = head; auto cur = res; while (cur->next != nullptr && cur->next->next != nullptr) { if (cur->next->val == cur->next->next->val) { int val = cur->next->val; // 跳過所有相同的值 while (cur->next != nullptr && cur->next->val == val) { cur->next = cur->next->next; } } else { cur = cur->next; } } // 返回值需要去掉增加的表頭 return res->next; } };
以上就是c++算法進(jìn)階刪除有序鏈表中的重復(fù)元素的詳細(xì)內(nèi)容,更多關(guān)于c++刪除有序鏈表重復(fù)元素的資料請關(guān)注腳本之家其它相關(guān)文章!
- C C++算法題解LeetCode1408數(shù)組中的字符串匹配
- Java?C++算法題解leetcode801使序列遞增的最小交換次數(shù)
- Java?C++題解leetcode字符串輪轉(zhuǎn)KMP算法詳解
- Java C++算法題解leetcode1592重新排列單詞間的空格
- Java C++ 算法題解leetcode1582二進(jìn)制矩陣特殊位置
- Java?C++?算法題解leetcode145商品折扣后最終價格單調(diào)棧
- Java C++ 算法leetcode828統(tǒng)計子串中唯一字符乘法原理
- Java?C++?算法題解leetcode669修剪二叉搜索樹示例
相關(guān)文章
C語言關(guān)于include順序不同導(dǎo)致編譯結(jié)果不同的問題
這篇文章主要介紹了在日常調(diào)試C語言中include的順序不同從而影響最后編譯結(jié)果不同的問題,究其原因是寫代碼的習(xí)慣所導(dǎo)致,下面跟小編一起來看看吧2022-04-04C++數(shù)據(jù)結(jié)構(gòu)之文件壓縮(哈夫曼樹)實(shí)例詳解
這篇文章主要介紹了C++數(shù)據(jù)結(jié)構(gòu)之文件壓縮(哈夫曼樹)實(shí)例詳解的相關(guān)資料,利用哈夫曼編碼的方式對文件進(jìn)行壓縮,并且對壓縮文件可以解壓,需要的朋友可以參考下2017-07-07fatal error LNK1104: 無法打開文件“l(fā)ibc.lib”的解決方法
本篇文章是對fatal error LNK1104: 無法打開文件“l(fā)ibc.lib”的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05Visual?Studio2022配置ReSharper?C++?常用設(shè)置方法
這篇文章主要介紹了Visual?Studio2022配置ReSharper?C++?常用設(shè)置,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),文中介紹了卸載Resharper的方法及Resharper激活碼,感興趣的朋友參考下吧2024-01-01