LeetCode刷題鏈表

文章目錄

  • 鏈表總結 + 常用技巧
  • 兩數相加
    • 題解
    • 代碼
  • 兩兩交換鏈表中的節點
    • 題解
    • 代碼
  • 重排鏈表
    • 題解
    • 代碼
  • 合并k個升序鏈表
    • 題解
    • 代碼
  • K個一組翻轉鏈表
    • 題解
    • 代碼

在這里插入圖片描述

鏈表總結 + 常用技巧

  1. 畫圖 = 直觀 + 形象 + 便于理解
  2. 引入虛擬頭節點,便于處理邊界情況,方便我們對鏈表進行操作

在這里插入圖片描述
3. 大膽去定義變量,不要吝嗇空間,可以簡單化鏈表鏈接
在這里插入圖片描述

  1. 快慢雙指針,判斷環,找鏈表中環的入口,找鏈表中倒數第n個節點
  2. 鏈表中的常用操作:
    創建一個新節點 new
    尾插
    頭插,使用虛擬頭節點,例題逆序鏈表,如下圖

在這里插入圖片描述

兩數相加

題目鏈接
在這里插入圖片描述

題解

1. 在鏈表中模擬兩數相加的過程
2. 注意t的進位,一個鏈表比另一個鏈表長的情況,開虛擬頭結點,我們模擬相加的時候從低位開始加,這里剛好是從低位開始加的,不需要逆置鏈表

在這里插入圖片描述

代碼

class Solution 
{
public:ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {// 記錄第一個鏈表和第二個鏈表ListNode* cur1 = l1,*cur2 = l2;ListNode* newhead = new ListNode(0);// 哨兵位節點int t = 0;// 記錄進位ListNode* pcur = newhead;// 尾指針// cur1,cur2,t都不為空while(cur1 || cur2 || t){// 加上第一個鏈表if(cur1){t += cur1->val;cur1 = cur1->next;}// 加上第二個鏈表if(cur2){t += cur2->val;cur2 = cur2->next;}pcur->next = new ListNode(t % 10);pcur = pcur->next;t /= 10;}    // 防止內存泄漏pcur = newhead->next;delete newhead;return pcur;}
};

兩兩交換鏈表中的節點

題目鏈接
在這里插入圖片描述

題解

1. 模擬
2. 創建4個變量,一個虛擬節點,最后只需返回虛擬節點的next指針,然后交換兩數的指針,讓指針移動到下一個要交換的位置
3. 注意數為奇數和偶數的情況,為偶數時cur指針為空,為奇數的時候next指針為空

在這里插入圖片描述

代碼

class Solution 
{
public:ListNode* swapPairs(ListNode* head) {if(head == nullptr) return nullptr;if(head->next == nullptr) return head;ListNode* newhead = new ListNode(0);ListNode* prev = newhead;ListNode* cur = head;ListNode* next = cur->next;ListNode* nnext = next->next;while(cur && next){// 交換節點prev->next = next; next->next = cur;cur->next = nnext;// 修改指針并且注意順序prev = cur;cur = nnext;if(cur == nullptr) break;next = nnext->next;if(next == nullptr) break;nnext = next->next;}cur = newhead->next;delete newhead;return cur;}
};

重排鏈表

題目鏈接
在這里插入圖片描述

題解

1. 模擬
2. 先找到鏈表的中間節點,slow->next為分割點分割兩個鏈表,利用頭插法逆置后面的一個鏈表,最后按順序鏈接兩個鏈表

在這里插入圖片描述

利用快慢雙指針分割鏈表
在這里插入圖片描述
頭插法
在這里插入圖片描述

代碼

class Solution 
{
public:void reorderList(ListNode* head) {// 快慢雙指針找鏈表的中間節點// 0個1個2個節點不需要重排if(head == nullptr || head->next == nullptr || head->next->next == nullptr) return;ListNode* slow = head;ListNode* fast = head;// 奇數個節點和偶數個節點while(fast && fast->next){slow = slow->next;fast = fast->next->next;}// 把slow->next做為分割鏈表的節點// 方便分割鏈表// 否則slow做為分割節點,還需要加入虛擬節點,也還是是slow->next// 頭插法進行分割鏈表// 逆置第二個鏈表ListNode* head2 = new ListNode(0);ListNode* cur = slow->next;slow->next = nullptr;while(cur){ListNode* next = cur->next;cur->next = head2->next;head2->next = cur;cur = next;}// 尾插法連接兩個鏈表ListNode* newhead = new ListNode(0);ListNode* prev = newhead;ListNode* cur1 = head,*cur2 = head2->next;// 第一個鏈表比第二個鏈表長while(cur1){prev->next = cur1;cur1 = cur1->next;prev = prev->next;if(cur2){prev->next = cur2;cur2 = cur2->next;prev = prev->next;}}delete head2;delete newhead;}
};

合并k個升序鏈表

題目鏈接
在這里插入圖片描述

題解

在這里插入圖片描述

代碼

class Solution 
{struct cmp{bool operator()(const ListNode* l1,const ListNode* l2){return l1->val > l2->val;}};
public:ListNode* mergeKLists(vector<ListNode*>& lists) {// 創建一個小根堆priority_queue<ListNode*,vector<ListNode*>,cmp> heap;// 讓所有的頭結點進入小根堆for(auto& x : lists){if(x) heap.push(x);}ListNode* newhead = new ListNode(0);ListNode* cur = newhead;while(!heap.empty()){ListNode* t = heap.top();cur->next = t;heap.pop();cur = cur->next;if(t->next) heap.push(t->next); }cur = newhead->next;delete  newhead;return cur;}
};

K個一組翻轉鏈表

題目鏈接
在這里插入圖片描述

題解

1. 注意每次更新一下prev這個指針,prev = tmp
在這里插入圖片描述

代碼

class Solution 
{
public:ListNode* reverseKGroup(ListNode* head, int k) {// 先算出有多少個節點int count = 0;ListNode* cur = head;while(cur){count++;cur = cur->next;}// 頭插法int p = count / k;ListNode* newhead = new ListNode(0);ListNode* prev = newhead;cur = head;for(int i = 0;i < p;i++){ListNode* tmp = cur; for(int j = 0;j < k;j++){ListNode* next = cur->next;cur->next = prev->next;prev->next = cur;cur = next;}prev = tmp;}prev->next = cur;prev = newhead->next;delete newhead;return prev;}
};

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

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

相關文章

ESP32S3 多固件燒錄方法、合并多個固件為單一固件方法

ESP32S3 多固件燒錄方法、合并多個固件為單一固件方法 文章目錄 ESP32S3 多固件燒錄方法、合并多個固件為單一固件方法前言1、前期準備工作2、多固件燒錄方法3、單固件燒錄方法總結 前言 使用正點原子的ESP32S3 BOX開發板獨立燒錄編譯生成的xxx.bin固件無法正常運行起來&#…

Webug4.0靶場通關筆記10- 第14關鏈接注入

目錄 第14關 鏈接注入 1.打開靶場 2.源碼分析 3.滲透實戰 &#xff08;1&#xff09;方法1&#xff1a;跳轉外部網頁 &#xff08;2&#xff09;方法2&#xff1a;獲取cookie 4.漏洞防御 本文通過《webug靶場第14關 鏈接注入》來進行滲透實戰。 第14關 鏈接注入 鏈接注…

SpringBoot的汽車商城后臺管理系統源碼開發實現

概述 汽車商城后臺管理系統專為汽車4S店和經銷商設計&#xff0c;提供全面的汽車管理系統解決方案。 主要內容 1. 核心功能模塊 系統提供以下主要功能&#xff1a; ??銷售管理??&#xff1a;記錄銷售信息&#xff0c;跟蹤交易進度??客戶管理??&#xff1a;維護客戶…

VBA代碼解決方案第二十四講:EXCEL中,如何刪除重復數據行

《VBA代碼解決方案》(版權10028096)這套教程是我最早推出的教程&#xff0c;目前已經是第三版修訂了。這套教程定位于入門后的提高&#xff0c;在學習這套教程過程中&#xff0c;側重點是要理解及掌握我的“積木編程”思想。要靈活運用教程中的實例像搭積木一樣把自己喜歡的代碼…

日本IT行業|salesforce開發語言占據的地位

在日本的IT行業中&#xff0c;Salesforce 開發語言處于一個較為專業但穩步增長的細分領域&#xff0c;并不是主流開發語言&#xff08;如 Java、Python、PHP&#xff09;&#xff0c;但其在某些行業和場景中地位越來越重要。 本篇以下是詳細分析&#xff1a; Salesforce開發語言…

前端開發,文件在鏡像服務器上不存在問題:Downloading binary from...Cannot download...

問題與處理策略 問題描述 在 Vue 項目中&#xff0c;執行 npm i 下載依賴時&#xff0c;報如下錯誤 Downloading binary from https://npm.taobao.org/mirrors/node-sass//v4.14.1/win32-x64-72_binding.node Cannot download "https://npm.taobao.org/mirrors/node-sa…

基于Vue2 + Element 實現任務列表管理功能的詳細教程

前言&#xff1a;本文介紹的是如何從0開始搭建Vue2項目到1實現對任務添加、刪除和篩選的功能&#xff0c;&#x1f517; 相關鏈接Vue 入門(安裝與應用超詳細教程) ? 【作者主頁—&#x1f4da;閱讀更多優質文章、獲取更多優質源碼】 目錄 一 . 項目搭建 1.1 安裝node.js 1.…

【PostgreSQL數據分析實戰:從數據清洗到可視化全流程】1.4 數據庫與表的基本操作(DDL/DML語句)

&#x1f449; 點擊關注不迷路 &#x1f449; 點擊關注不迷路 &#x1f449; 點擊關注不迷路 文章大綱 1.4 數據庫與表的基本操作&#xff08;DDL/DML語句&#xff09;1.4.1 數據庫生命周期管理&#xff08;DDL核心&#xff09;1.4.1.1 創建數據庫&#xff08;CREATE DATABASE&…

Fabrice Bellard(個人網站:?bellard.org?)介紹

Fabrice Bellard 是法國人&#xff0c;國際著名程序員。1972年生于法國Grenoble&#xff0c;大學就讀于巴黎高等綜合理工學院&#xff0c;后在國立巴黎高等電信學院攻讀。 Fabrice Bellard&#xff08;個人網站&#xff1a;?bellard.org?&#xff09;是計算機領域最具影響力…

USB布局布線

1USB簡介 USB是通用串行總線的英文縮寫&#xff0c;是連接外部裝置的一個串口總線標準&#xff0c;也是一種輸入輸出接口的技術規范&#xff0c;被廣泛地應用于個人電腦和移動設備等信息通迅產品&#xff0c;并擴展到攝影器材&#xff0c;數字電視&#xff08;機頂盒&#xff0…

【數據結構】線性表--鏈表

【數據結構】線性表--鏈表 一.前情回顧二.鏈表的概念三.鏈表的實現1.鏈表結點的結構&#xff1a;2.申請新結點函數&#xff1a;3.尾插函數&#xff1a;4.頭插函數&#xff1a;5.尾刪函數&#xff1a;6.頭刪函數&#xff1a;7.在指定結點之前插入&#xff1a;8.在指定結點之后插…

Mybatis-plus代碼生成器的創建使用與詳細解釋

Mybatis-plus代碼生成器的創建使用與詳細解釋 一、代碼生成器概述 1. 定義(什么是代碼生成器) 在軟件開發過程中&#xff0c;存在大量重復性的代碼編寫工作&#xff0c;例如實體類、Mapper 接口、Service 接口及實現類等。代碼生成器就是為了解決這類問題而誕生的工具。MyBa…

drawDB:打造高效數據庫設計流程

drawDB&#xff1a;打造高效數據庫設計流程 drawDB 簡介資源鏈接 核心功能詳解1. 直觀的實體關系圖設計2. SQL 腳本生成3. SQL 導入功能4. 本地化存儲與分享功能5. 自定義主題與外觀 安裝和使用教程本地開發環境搭建構建生產版本Docker 部署基本使用方法 應用場景和實際價值適用…

基于 ESP32 和 GC9D01 0.71寸TFT屏幕的逼真眼睛與寫輪眼動態顯示

近期&#xff0c;我利用 ESP32 和 GC9D01 0.71’TFT 進行了一次有趣的顯示項目開發&#xff0c;成功實現了在該小尺寸屏幕上繪制逼真眼睛和寫輪眼的效果。 硬件準備 主控板 &#xff1a;ESP32&#xff0c;具備強大的處理能力和豐富的接口資源&#xff0c;能夠高效地處理圖像數…

LeetCode58_最后一個單詞的長度

LeetCode58_最后一個單詞的長度 標簽&#xff1a;#字符串Ⅰ. 題目Ⅱ. 示例 0. 個人方法 標簽&#xff1a;#字符串 Ⅰ. 題目 給你一個字符串 s&#xff0c;由若干單詞組成&#xff0c;單詞前后用一些空格字符隔開。返回字符串中 最后一個 單詞的長度。 單詞 是指僅由字母組成、…

論文閱讀:MAXIM Multi-Axis MLP for Image Processing

這是 2022 CVPR 上的一篇文章&#xff0c;介紹了用 MLP 做 low-level 圖像處理的工作 Abstract 近年來&#xff0c;Transformer 和多層感知機&#xff08;MLP&#xff09;模型的發展為計算機視覺任務提供了新的網絡架構設計。盡管這些模型在圖像識別等許多視覺任務中已被證明…

PostgreSQL初試

文章目錄 1 PostgreSQL 簡介2 PostgreSQL 與 MySQL 的區別3 PostgreSQL 的安裝1_Linux部署2_容器化部署 4 PostgreSQL的配置1_遠程連接配置2_配置數據庫的日志3_設置數據庫密碼 5 PostgreSQL 基本操作1_用戶操作2_權限操作3_創建一個自己的用戶4_差異補充 6 安裝圖形化界面1_使…

Fortran語言,do-end do循環,相互包含測試,自動性能優化

1&#xff09;上代碼 !$omp parallel private(n, j, dx, dy, dz, r, a)do n 1, nsteps!$omp dodo i 0, nparticles - 1x_tmp(i) x(i) vx(i) * dty_tmp(i) y(i) vy(i) * dtz_tmp(i) z(i) vz(i) * dtdo j 0, nparticles - 1dx x(j) - x(i)dy y(j) - y(i)dz z(j) - z(…

Cona編譯問題

問題描述 Clion 使用conan插件配置了C工程&#xff0c;然后想通過命令行進行編譯執行。 出現以下錯誤 CMake Error at /usr/local/Cellar/cmake/3.30.1/share/cmake/Modules/CMakeDetermineSystem.cmake:152 (message):Could not find toolchain file: conan_toolchain.cmake…

Qt實現 hello world + 內存泄漏(5)

文章目錄 實現hello world的兩種方式通過圖形化的方式通過純代碼的方式1. 新老頭文件的說明2.堆或棧上創建對象的選擇3.QString的說明 內存泄漏問題 實現hello world的兩種方式 通過圖形化的方式 通過圖形化的方式&#xff0c;在界面上創建出一個控件&#xff0c;顯示出hello …