c++算法進(jìn)階刪除有序鏈表中的重復(fù)元素
題目
給出一個(gè)升序排序的鏈表,刪除鏈表中的所有重復(fù)出現(xiàn)的元素,只保留原鏈表中只出現(xiàn)一次的元素。
例如:
給出的鏈表為1→2→3→3→4→4→5, 返回1→2→5。
給出的鏈表為1→1→1→2→3, 返回2→3。
數(shù)據(jù)范圍:鏈表長(zhǎng)度0≤n≤10000,鏈表中的值滿足∣val∣≤1000
要求:空間復(fù)雜度O(n),時(shí)間復(fù)雜度O(n)
進(jìn)階:空間復(fù)雜度O(1),時(shí)間復(fù)雜度O(n)
示例
示例1
輸入:
{1,2,2}
返回值:
{1}示例2
輸入:
{}
返回值:
{}思路
因?yàn)槭巧虻逆湵恚貜?fù)的元素時(shí)連在一起的,所以可以連續(xù)的跳過相同的節(jié)點(diǎn)。
這里有個(gè)小技巧:因?yàn)殒湵碛锌赡芮皫讉€(gè)元素就是重復(fù)的,這時(shí)就需要?jiǎng)h除頭指針了,所以我們需要給鏈表增加一個(gè)自定義的表頭,以方便后面刪除了原來的頭指針而找不到表頭,還有需要注意的就是在返回的時(shí)候要去掉增加的表頭。
這種解法的空間復(fù)雜度是O(1),另外也可以通過哈希表unordered_map來記錄每個(gè)節(jié)點(diǎn)值出現(xiàn)的次數(shù)來解決這個(gè)問題。哈希表的方式空間復(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;
}
// 給鏈表增加一個(gè)表頭,以便可以刪除原鏈表的頭結(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ù)元素的資料請(qǐng)關(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商品折扣后最終價(jià)格單調(diào)棧
- Java C++ 算法leetcode828統(tǒng)計(jì)子串中唯一字符乘法原理
- Java?C++?算法題解leetcode669修剪二叉搜索樹示例
相關(guān)文章
Qt6.0+vs2019環(huán)境配置的實(shí)現(xiàn)教程
這篇文章主要介紹了Qt6.0+vs2019環(huán)境配置的實(shí)現(xiàn)教程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
C語言采用文本方式和二進(jìn)制方式打開文件的區(qū)別分析
這篇文章主要介紹了C語言采用文本方式和二進(jìn)制方式打開文件的區(qū)別分析,有助于讀者更好的理解文本文件與二進(jìn)制文件的原理,需要的朋友可以參考下2014-07-07
C++類與對(duì)象之日期類的實(shí)現(xiàn)
這篇文章主要介紹如何實(shí)現(xiàn)C++中的日期類相關(guān)資料,需要的朋友可以參考下面文章的具體內(nèi)容2021-09-09
C++中隱式類型轉(zhuǎn)換學(xué)習(xí)筆記
在本篇文章里小編給大家整理的是一篇關(guān)于C++中隱式類型轉(zhuǎn)換學(xué)習(xí)筆記內(nèi)容,有興趣的跟著小編來學(xué)習(xí)下吧。2020-02-02
詳解C++標(biāo)準(zhǔn)庫(kù)中處理正則表達(dá)式的類std::regex
std?是?C++?標(biāo)準(zhǔn)庫(kù)的命名空間,包含了大量標(biāo)準(zhǔn)的?C++?類、函數(shù)和對(duì)象,這些類和函數(shù)提供了廣泛的功能,包括輸入輸出、容器、算法、字符串處理等,這篇文章主要介紹了C++標(biāo)準(zhǔn)庫(kù)中提供的用于處理正則表達(dá)式的類std::regex,需要的朋友可以參考下2024-03-03

