leetcode hot100 鏈表(二)

書接上回:

leetcode hot100 鏈表(一)-CSDN博客

8.刪除鏈表的倒數第N個結點

class Solution {
public:ListNode* removeNthFromEnd(ListNode* head, int n) {ListNode* curr=head;int len=0;while(curr){curr=curr->next;len++;}int pos=len-n;if(pos==0){ListNode* newHead=head->next;return newHead;}curr=head;while(--pos) curr=curr->next;  //目標是把curr移動到要刪除結點的前面curr->next=curr->next->next;return head;}
};

9.兩兩交換鏈表中的結點

????????參考leetcode靈神題解:

class Solution {
public:ListNode* swapPairs(ListNode* head) {ListNode* dummy=new ListNode(0,head); //dummy->val=0&&dummy->next=head;ListNode* node0=dummy;ListNode* node1=head;while(node1&&node1->next){ListNode* node2=node1->next;ListNode* node3=node2->next;node0->next=node2;node2->next=node1;node1->next=node3;node0=node1;node1=node3;}return dummy->next;}
};

10.k個一組反轉鏈表

? ? ? ? 和上題使用了相同的命名體系。

class Solution {
public:ListNode* reverseKGroup(ListNode* head, int k) {ListNode* dummy=new ListNode(0,head);ListNode* node0=dummy;ListNode* node1=node0->next;while(node1&&node1->next){ListNode* node2=node1->next;ListNode* cnt=node2;for(int i=1;i<k;i++){if(cnt==nullptr) return dummy->next;cnt=cnt->next;}for(int i=1;i<k;i++){node1->next=node2->next;node2->next=node0->next;  //node0->next始終指向當前鏈表的頭部node0->next=node2;node2=node1->next;}node0=node1;node1=node0->next;}return dummy->next;}
};

11.隨機鏈表的復制

????????哈希映射法建立新鏈表結點與原節點的映射關系。

class Solution {
public:unordered_map<Node*,Node*> map;  //存儲原鏈表節點到新鏈表節點的映射Node* copyRandomList(Node* head) {if(!head) return nullptr;//檢查當前節點是否已經在哈希表中(即是否已經被復制過)//如果節點未被復制過,則創建一個新節點,值與原節點相同,并將原節點和新節點的映射存入哈希表if(!map.count(head)){Node* newHead=new Node(head->val);map[head]=newHead;//遞歸復制next指針指向的鏈表部分和random指針指向的節點newHead->next=copyRandomList(head->next);newHead->random=copyRandomList(head->random);}return map[head];  //返回頭結點在新鏈表中的映射}
};

12.排序鏈表

? ? ? ? 類似歸并排序方法,先二分找到中點(通過快慢指針法),再對左右兩邊分別排序,最后合并兩部分。

class Solution {// 鏈表的中間結點(快慢指針)ListNode* middleNode(ListNode* head) {ListNode* pre=head;ListNode* slow=head;ListNode* fast=head;while (fast&&fast->next) {pre=slow; // 記錄 slow 的前一個節點slow=slow->next;fast=fast->next->next;}pre->next=nullptr; // 斷開 slow 的前一個節點和 slow 的連接return slow;  // 鏈表后半部分}// 合并兩個有序鏈表(雙指針),歸并思想ListNode* merge(ListNode* list1, ListNode* list2) {ListNode dummy; // 用哨兵節點簡化代碼邏輯ListNode* cur=&dummy; // cur 指向新鏈表的末尾while(list1&&list2){if(list1->val<=list2->val){cur->next=list1; // 把 list1 加到新鏈表中list1=list1->next;} else{ cur->next=list2;list2=list2->next;}cur=cur->next;}cur->next=list1?list1:list2; // 拼接剩余鏈表return dummy.next;}
public:ListNode* sortList(ListNode* head) {if (!head||!head->next) return head;// 找到中間節點 head2,并斷開 head2 與其前一個節點的連接,然后分治、合并// 比如 head=[4,2,1,3],那么 middleNode 調用結束后 head=[4,2] head2=[1,3]ListNode* head2 = middleNode(head);head=sortList(head);head2=sortList(head2);return merge(head, head2);}
};

13.合并k個升序鏈表

? ? ? ? 利用小根堆實現,小根堆里維護每個非空鏈表未被處理的第一個結點

class Solution {
public:ListNode* mergeKLists(vector<ListNode*>& lists) {struct Cmp{bool operator()(ListNode* a, ListNode* b){return a->val>b->val;}};priority_queue<ListNode*,vector<ListNode*>,Cmp> min_heap;  //優先隊列模擬小根堆for(ListNode* node:lists){if (node) min_heap.push(node);  //把所有非空鏈表的頭結點入堆 }ListNode dummy(0);  ListNode* tail=&dummy;  //tail負責維護合并后的新鏈表while(!min_heap.empty()){ListNode* min_node=min_heap.top();  //剩余結點中的最小結點min_heap.pop(); if(min_node->next) min_heap.push(min_node->next);tail->next=min_node;  //把min_node添加到新鏈表末尾tail=tail->next;  //準備合并下一個結點}return dummy.next;}
};

14.LRU緩存

struct DLinkedNode {int key, value;DLinkedNode* prev;DLinkedNode* next;DLinkedNode():key(0),value(0),prev(nullptr),next(nullptr){}DLinkedNode(int _key,int _value):key(_key),value(_value),prev(nullptr),next(nullptr){}
};
class LRUCache {
private:unordered_map<int, DLinkedNode*> cache;DLinkedNode* head;DLinkedNode* tail;int size;int capacity;
public:LRUCache(int _capacity): capacity(_capacity), size(0) {// 使用偽頭部和偽尾部節點head = new DLinkedNode();tail = new DLinkedNode();head->next=tail;tail->prev=head;}int get(int key){if(!cache.count(key)) return -1;// 如果 key 存在,先通過哈希表定位,再移到頭部DLinkedNode* node=cache[key];moveToHead(node);return node->value;}void put(int key, int value) {if (!cache.count(key)) {// 如果 key 不存在,創建一個新的節點DLinkedNode* node = new DLinkedNode(key, value);// 添加進哈希表cache[key] = node;// 添加至雙向鏈表的頭部addToHead(node);size++;if(size>capacity) {// 如果超出容量,刪除雙向鏈表的尾部節點DLinkedNode* removed = removeTail();// 刪除哈希表中對應的項cache.erase(removed->key);// 防止內存泄漏delete removed;size--;}}else {// 如果 key 存在,先通過哈希表定位,再修改 value,并移到頭部DLinkedNode* node = cache[key];node->value = value;moveToHead(node);}}void addToHead(DLinkedNode* node) {node->prev=head;node->next=head->next;head->next->prev=node;head->next=node;}void removeNode(DLinkedNode* node) {node->prev->next=node->next;node->next->prev=node->prev;}void moveToHead(DLinkedNode* node){removeNode(node);addToHead(node);}DLinkedNode* removeTail(){DLinkedNode* node=tail->prev;removeNode(node);return node;}
};

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/908361.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/908361.shtml
英文地址,請注明出處:http://en.pswp.cn/news/908361.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Compose Multiplatform 實現自定義的系統托盤,解決托盤亂碼問題

Compose Multiplatform是 JetBrains 開發的聲明式 UI 框架&#xff0c;可讓您為 Android、iOS、桌面和 Web 開發共享 UI。將 Compose Multiplatform 集成到您的 Kotlin Multiplatform 項目中&#xff0c;即可更快地交付您的應用和功能&#xff0c;而無需維護多個 UI 實現。 在…

C++11 Move Constructors and Move Assignment Operators 從入門到精通

文章目錄 一、引言二、基本概念2.1 右值引用&#xff08;Rvalue References&#xff09;2.2 移動語義&#xff08;Move Semantics&#xff09; 三、移動構造函數&#xff08;Move Constructors&#xff09;3.1 定義和語法3.2 示例代碼3.3 使用場景 四、移動賦值運算符&#xff…

Linux配置yum 時間同步服務 關閉防火墻 關閉ESlinux

1、配置yum 1.1、Could not resolve host: mirrorlist.centos.org; 未知的錯誤 https://blog.csdn.net/fansfi/article/details/146369946?fromshareblogdetail&sharetypeblogdetail&sharerId146369946&sharereferPC&sharesourceRockandrollman&sharefr…

使用 uv 工具快速部署并管理 vLLM 推理環境

uv&#xff1a;現代 Python 項目管理的高效助手 uv&#xff1a;Rust 驅動的 Python 包管理新時代 在部署大語言模型&#xff08;LLM&#xff09;推理服務時&#xff0c;vLLM 是一個備受關注的方案&#xff0c;具備高吞吐、低延遲和對 OpenAI API 的良好兼容性。為了提高部署效…

基于sqlite的任務鎖(支持多進程/多線程)

前言 介紹 任務鎖,在多進程服務間控制耗時任務的鎖,確保相同id的耗時任務同時只有一個在執行 依賴 SqliteOp,參考這篇文章 https://blog.csdn.net/weixin_43721000/article/details/137019125 實現方式 utils/taskLock.py import timefrom utils.SqliteOp import Sqli…

html表格轉換為markdown

文章目錄 工具功能亮點1.核心實現解析1. 剪貼板交互2. HTML檢測與提取3. 轉換規則設計 2. 完整代碼 在日常工作中&#xff0c;我們經常遇到需要將網頁表格快速轉換為Markdown格式的場景。無論是文檔編寫、知識整理還是數據遷移&#xff0c;手動轉換既耗時又容易出錯。本文將介紹…

IDEA 中 Undo Commit,Revert Commit,Drop Commit區別

一、Undo Commit 適用情況&#xff1a;代碼修改完了&#xff0c;已經Commit了&#xff0c;但是還未push&#xff0c;然后發現還有地方需要修改&#xff0c;但是又不想增加一個新的Commit記錄。這時可以進行Undo Commit&#xff0c;修改后再重新Commit。如果已經進行了Push&…

【Linux】Linux 進程間通訊-管道

參考博客&#xff1a;https://blog.csdn.net/sjsjnsjnn/article/details/125864580 一、進程間通訊介紹 1.1 進程間通訊的概念 進程通信&#xff08;Interprocess communication&#xff09;&#xff0c;簡稱&#xff1a;IPC 本來進程之間是相互獨立的。但是由于不同的進程…

深度剖析 DeepSeek 開源模型部署與應用:策略、權衡與未來走向

在人工智能技術呈指數級發展的當下&#xff0c;大模型已然成為推動各行業變革的核心驅動力。DeepSeek 開源模型以其卓越的性能和靈活的開源特性&#xff0c;吸引了眾多企業與開發者的目光。如何高效且合理地部署與運用 DeepSeek 模型&#xff0c;成為釋放其巨大潛力的關鍵所在&…

第34次CCF-CSP認證真題解析(目標300分做法)

第34次CCF-CSP認證 矩陣重塑&#xff08;其一&#xff09;AC代碼及解析矩陣重塑&#xff08;其二&#xff09;AC代碼及解析貨物調度AC代碼及解析 矩陣重塑&#xff08;其一&#xff09; 輸入輸出及樣例&#xff1a; AC代碼及解析 1.線性化原矩陣 &#xff1a;由于cin的特性我們…

智能制造數字孿生全要素交付一張網:智造中樞,孿生領航,共建智造生態共同體

在制造業轉型升級的浪潮中&#xff0c;數字孿生技術正成為推動行業變革的核心引擎。從特斯拉通過數字孿生體實現車輛全生命周期優化&#xff0c;到海爾卡奧斯工業互聯網平臺賦能千行百業&#xff0c;數字孿生技術已從概念驗證走向規模化落地。通過構建覆蓋全國的交付網絡&#…

【技術】跨設備鏈路聚合的技術——M-LAG

原創&#xff1a;廈門微思網絡 M-LAG&#xff08;Multichassis Link Aggregation Group&#xff09;提供一種跨設備鏈路聚合的技術。M-LAG通過將兩臺接入交換機以同一個狀態和用戶側設備或服務器進行跨設備的鏈路聚合&#xff0c;把鏈路的可靠性從單板級提升到設備級。同時&…

AI健康小屋+微高壓氧艙:科技如何重構我們的健康防線?

目前&#xff0c;隨著科技和社會的不斷發展&#xff0c;人們的生活水平和方式有了翻天覆地的變化。 從吃飽穿暖到吃好喝好再到健康生活&#xff0c;觀念也在逐漸發生改變。 尤其是在21世紀&#xff0c;大家對健康越來越重視&#xff0c;這就不得不提AI健康小屋和氧艙。 一、A…

Python訓練營---Day44

DAY 44 預訓練模型 知識點回顧&#xff1a; 預訓練的概念常見的分類預訓練模型圖像預訓練模型的發展史預訓練的策略預訓練代碼實戰&#xff1a;resnet18 作業&#xff1a; 嘗試在cifar10對比如下其他的預訓練模型&#xff0c;觀察差異&#xff0c;盡可能和他人選擇的不同嘗試通…

1.文件操作相關的庫

一、filesystem(C17) 和 fstream 1.std::filesystem::path - cppreference.cn - C參考手冊 std::filesystem::path 表示路徑 構造函數&#xff1a; path( string_type&& source, format fmt auto_format ); 可以用string進行構造&#xff0c;也可以用string進行隱式類…

【 java 集合知識 第二篇 】

目錄 1.Map集合 1.1.快速遍歷Map 1.2.HashMap實現原理 1.3.HashMap的擴容機制 1.4.HashMap在多線程下的問題 1.5.解決哈希沖突的方法 1.6.HashMap的put過程 1.7.HashMap的key使用什么類型 1.8.HashMapkey可以為null的原因 1.9.HashMap為什么不采用平衡二叉樹 1.10.Hash…

【Dify 知識庫 API】“根據文本更新文檔” 真的是差異更新嗎?一文講透真實機制!

在使用 Dify 知識庫 API 過程中,很多開發者在調用 /datasets/{dataset_id}/document/update-by-text 接口時,常常會產生一個疑問: ?? 這個接口到底是 “智能差異更新” 還是 “純覆蓋更新”? 網上的資料并不多,很多人根據接口名誤以為是增量更新。今天我結合官方源碼 …

大模型如何革新用戶價值、內容匹配與ROI預估

寫在前面 在數字營銷的戰場上,理解用戶、精準觸達、高效轉化是永恒的追求。傳統方法依賴結構化數據和機器學習模型,在用戶價值評估、人群素材匹配以及策略ROI預估等核心問題上取得了顯著成就。然而,隨著數據維度日益復雜,用戶行為愈發多變,傳統方法也面臨著特征工程繁瑣、…

基于端到端深度學習模型的語音控制人機交互系統

基于端到端深度學習模型的語音控制人機交互系統 摘要 本文設計并實現了一個基于端到端深度學習模型的人機交互系統,通過語音指令控制其他設備的程序運行,并將程序運行結果通過語音合成方式反饋給用戶。系統采用Python語言開發,使用PyTorch框架實現端到端的語音識別(ASR)…

【2025年】解決Burpsuite抓不到https包的問題

環境&#xff1a;windows11 burpsuite:2025.5 在抓取https網站時&#xff0c;burpsuite抓取不到https數據包&#xff0c;只顯示&#xff1a; 解決該問題只需如下三個步驟&#xff1a; 1、瀏覽器中訪問 http://burp 2、下載 CA certificate 證書 3、在設置--隱私與安全--…