【代碼隨想錄算法訓練營——Day4】鏈表——24.兩兩交換鏈表中的節點、19.刪除鏈表的倒數第N個節點、面試題02.07.鏈表相交、142.環形鏈表II

LeetCode題目鏈接
https://leetcode.cn/problems/swap-nodes-in-pairs/
https://leetcode.cn/problems/remove-nth-node-from-end-of-list/
https://leetcode.cn/problems/intersection-of-two-linked-lists-lcci/description/
https://leetcode.cn/problems/linked-list-cycle-ii/

題解
24.兩兩交換鏈表中的節點
可以模擬一下畫個圖,注意設立虛擬頭結點。

19.刪除鏈表的倒數第N個節點
注意要找到被刪除結點的前一個結點(這道題也是被提示這個思路才做出來的)。

面試題02.07.鏈表相交
啟發思路:先求出兩個鏈表長度,再求長度的差值,讓長鏈表的指針移動到與短鏈表剩余長度相同的位置。
注意此題只能在leetcode上跑出正確結果,本地IDE運行時兩個鏈表是單獨建成不相交,所以無結果,下面附著的代碼是本地代碼。

142.環形鏈表II
拿到題目第一反應,開一個10的4次方的數組,作為判定鏈表中結點值是否出現過的判定(假定題目給的鏈表結點沒有重復的,有重復的就不行了),如果當前結點的next結點的值顯示為判定過,則鏈表存在環。
看了題解,采用快慢指針法。
本題根據題解,有兩個地方需要注意,一是快慢指針遍歷時的循環條件,我在代碼里注釋掉的是我自己寫的,此時當結點只有一個時就會報錯,因為快指針不存在下一個結點的next,下一個結點已然是NULL,因此在循環遍歷時是判斷快指針的存在與否與快指針的下一個結點存在與否;二是根據題解用數學方法求出環入口的位置,這段代碼的循環要放在第一個循環里面,因為只有在第一個循環中發現有環后才能再尋找環入口。代碼很簡潔,重要的是思想。

代碼

//24.兩兩交換鏈表中的節點
#include <iostream>
#include <vector>
using namespace std;struct ListNode {int val;ListNode *next;ListNode() : val(0), next(nullptr) {}ListNode(int x) : val(x), next(nullptr) {}ListNode(int x, ListNode *next) : val(x), next(next) {}};class Solution {
public:ListNode* swapPairs(ListNode* head) {if (head == NULL) return NULL;ListNode* pre1 = new ListNode;pre1->next = head;ListNode* pre2 = head;ListNode* pre3 = pre1;while (pre1!= NULL && pre2!= NULL && pre1->next != NULL && pre2->next != NULL) {int tmp = pre2->next->val;pre2->next->val = pre1->next->val;pre1->next->val = tmp;pre1 = pre1->next->next;pre2 = pre2->next->next;}return pre3->next;}
};ListNode* createList(vector<int> nums) {if (nums.size() == 0) return NULL;ListNode* cur = new ListNode(nums[0]);cur->next = NULL;ListNode* pre = cur;int len = 1;while (len < nums.size()) {cur->next = new ListNode(nums[len]);cur = cur->next;len++;}return pre;
}int main() {Solution s;vector<int> nums = { 1, 2, 3, 4, 5 };ListNode* node = createList(nums);ListNode* tmp = node;while (tmp != NULL) {printf("%d ", tmp->val);tmp = tmp->next;}printf("\n");node = s.swapPairs(node);while (node != NULL) {printf("%d ", node->val);node = node->next;}return 0;
}
//19.刪除鏈表的倒數第N個節點
#include <iostream>
#include <vector>
using namespace std;struct ListNode {int val;ListNode *next;ListNode() : val(0), next(nullptr) {}ListNode(int x) : val(x), next(nullptr) {}ListNode(int x, ListNode *next) : val(x), next(next) {}
};ListNode* createList(vector<int>nums) {ListNode* cur = new ListNode(nums[0]);ListNode* pre = cur;int len = 1;while (len < nums.size()) {cur->next = new ListNode(nums[len]);cur = cur->next;len++;}return pre;
}class Solution {
public:int getListLen(ListNode* head) {int len = 0;while (head) {len++;head = head->next;}return len;}ListNode* removeNthFromEnd(ListNode* head, int n) {int len = getListLen(head);int num = len - n;ListNode* pre = new ListNode;pre->next = head;ListNode* pre2 = pre;while (num--) {pre = pre->next;}pre->next = pre->next->next;return pre2->next;}
};int main() {vector<int> nums = { 1,2 };ListNode* node = createList(nums);ListNode* tmp = node;while (tmp) {printf("%d ", tmp->val);tmp = tmp->next;}printf("\n");Solution s;node = s.removeNthFromEnd(node, 1);while (node) {printf("%d ", node->val);node = node->next;}return 0;
}
//面試題02.07.鏈表相交
#include <iostream>
#include <vector>
using namespace std;struct ListNode {int val;ListNode *next;ListNode(int x) : val(x), next(NULL) {}
};ListNode* createList(vector<int> nums) {if (nums.size() == 0) return NULL;ListNode* cur = new ListNode(nums[0]);ListNode* pre = cur;int len = 1;while (len < nums.size()) {cur->next = new ListNode(nums[len]);cur = cur->next;len++;}return pre;
}class Solution {
public:int getListLen(ListNode* head) {int len = 0;while (head) {len++;head = head->next;}return len;}ListNode* getIntersectionNode(ListNode* headA, ListNode* headB) {int lenA = getListLen(headA), lenB = getListLen(headB);if (lenA < lenB) {ListNode* tmp = headA;headA = headB;headB = tmp;}int diff = abs(lenA - lenB);while (diff) {headA = headA->next;diff--;}while (headA && headB) {if (headA == headB) return headA;headA = headA->next;headB = headB->next;}return NULL;}
};int main() {vector<int> nums1 = { 4,1,8,4,5 }, nums2 = { 5,0,1,8,4,5 };ListNode* headA = createList(nums1);ListNode* headB = createList(nums2);Solution s;ListNode* node = s.getIntersectionNode(headA, headB);ListNode* tmp = headA;while (tmp) {printf("%d ", tmp->val);tmp = tmp->next;}printf("\n");tmp = headB;while (tmp) {printf("%d ", tmp->val);tmp = tmp->next;}printf("\n");while (node) {printf("%d ", node->val);node = node->next;}return 0;
}
//142.環形鏈表II
class Solution {
public:ListNode* detectCycle(ListNode* head) {ListNode* slow = head, *fast = head;//do {while (fast && fast->next) {slow = slow->next;fast = fast->next->next;//} while (slow != fast && slow && fast);if (slow == fast) {ListNode* index1 = head, * index2 = slow;while (index1 != index2) {index1 = index1->next;index2 = index2->next;}return index1;}}return NULL;}
};

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

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

相關文章

C#中一段程序類比博圖

using system //博圖中要使用自帶指令庫&#xff0c;指令庫名稱叫systemnamespace Simple//博圖建立程序&#xff0c;分診斷文件夾&#x1f4c2;&#xff0c;vision文件夾&#xff0c;通訊Db文件夾&#x1f4c2;等等&#xff0c;simple類似博圖中的文件夾名稱{class Program//程…

vue飛自在酒店管理系統(代碼+數據庫+LW)

摘 要 近年來&#xff0c;隨著科技的迅猛進步和經濟全球化的深入發展&#xff0c;互聯網技術正以前所未有的速度提升社會綜合發展的效能。這一技術的影響力已滲透到各行各業&#xff0c;其中&#xff0c;飛自在酒店管理系統在互聯網時代背景下扮演著舉足輕重的角色。信息管理…

2025年統計與數據分析領域專業認證發展指南

在數據驅動決策日益重要的背景下&#xff0c;專業認證作為提升統計學和數據分析能力的一種方式&#xff0c;受到越來越多從業者的關注。本文基于行業發展趨勢&#xff0c;分析6個相關領域的專業資格認證&#xff0c;為專業人士提供參考。一、數據分析能力認證含金量CDA數據分析…

激光頻率梳 3D 輪廓測量 - 油路板的凹槽深度和平面度測量

一、引言油路板作為液壓系統核心部件&#xff0c;其凹槽深度與平面度精度直接影響油液流動特性與密封性能。傳統測量方法在面對復雜油路結構時存在效率低、精度不足等問題。激光頻率梳 3D 輪廓測量技術憑借時頻基準優勢&#xff0c;為油路板關鍵參數測量提供了新路徑&#xff0…

七彩喜微高壓氧艙:科技與體驗的雙重革新,重新定義家用氧療新標桿

在高壓氧艙市場競爭日益激烈的今天&#xff0c;七彩喜微高壓氧艙憑借其獨特的技術創新、極致的用戶體驗和貼心的服務生態&#xff0c;在眾多品牌中脫穎而出。它不僅是一臺設備&#xff0c;更是一個“懂你需求、護你健康”的智能健康伙伴。對比其他品牌&#xff0c;七彩喜的優勢…

[光學原理與應用-418]:非線性光學 - 數學中的線性函數與非線性函數

線性函數與非線性函數是數學和工程領域中描述變量關系的基礎工具&#xff0c;二者在定義、性質、圖像特征及應用場景上存在本質差異。以下從核心概念、數學特性、圖像對比、應用場景及實際案例五個維度展開詳細分析&#xff1a;一、核心概念&#xff1a;線性 vs 非線性線性函數…

前端登錄鑒權詳解

1.cookie-session1. cookiecookie簡單來說就是瀏覽器客戶端在請求時會攜帶的一個字段數據&#xff0c;常用與保存當前用戶狀態并在請求時攜帶給服務端驗證。2. sessionsession簡單來說就是服務單對于每一個用戶生成一個用戶會話標識session /session id&#xff0c;并返回給客戶…

從零實現 LLM(上):原理講透 + 最小可運行 GPT

引言 為什么要學習 LLM&#xff1f; 當你和 ChatGPT 對話時&#xff0c;它不僅能回答你的問題&#xff0c;還能續寫故事、記住上下文&#xff0c;甚至調整風格。你可能會想&#xff1a;它是怎么做到的&#xff1f; 答案就是&#xff1a;大語言模型&#xff08;Large Languag…

浪潮科技Java開發面試題及參考答案(120道題-下)

如何給 MySQL 表添加索引?添加索引的語法是什么?添加索引時需要考慮哪些因素(如字段類型、查詢頻率、索引選擇性)? 給 MySQL 表添加索引需根據業務需求選擇合適的索引類型,不同類型的索引語法不同,同時需綜合評估字段特性、查詢模式等因素,避免無效或過度索引。 一、…

大數據畢業設計選題推薦-基于大數據的宮頸癌風險因素分析與可視化系統-Spark-Hadoop-Bigdata

?作者主頁&#xff1a;IT研究室? 個人簡介&#xff1a;曾從事計算機專業培訓教學&#xff0c;擅長Java、Python、微信小程序、Golang、安卓Android等項目實戰。接項目定制開發、代碼講解、答辯教學、文檔編寫、降重等。 ?文末獲取源碼? 精彩專欄推薦??? Java項目 Python…

【PyTorch實戰:Tensor變形】5、 PyTorch Tensor指南:從基礎操作到Autograd與GPU加速實戰

一、Tensor核心概念解析 1.1 什么是Tensor? Tensor是PyTorch中最基本的數據結構,也是深度學習框架的核心計算單元。我們可以將Tensor理解為多維數組的統一表示,它在PyTorch中的地位相當于NumPy中的ndarray,但具有兩個關鍵增強特性:GPU加速支持和自動求導能力。 1.2 為…

2025年我國具身智能產業鏈全景分析

一、具身智能產業概述與定義 1.1 具身智能的基本概念與內涵 具身智能&#xff08;Embodied Intelligence&#xff09;是指通過物理實體與環境進行交互的智能系統&#xff0c;其核心在于將感知、決策和執行緊密結合&#xff0c;使智能體能夠在動態環境中自主感知、學習和執行任務…

VMWare上搭建大數據集群

文章目錄1. 采用軟件較新版本2. 準備三臺虛擬機3. 搭建Hadoop集群3.1 在主節點上配置Hadoop3.1.1 編輯映射文件3.1.2 配置免密登錄3.1.3 配置JDK3.1.4 配置Hadoop3.2 從主節點分發到從節點3.3 格式化名稱節點3.4 啟動Hadoop集群3.5 使用Hadoop WebUI3.6 運行MR應用&#xff1a;…

小迪自用web筆記29

PHP刷新是點擊刷新之后原來的圖片替換掉&#xff0c;換成新的圖片。把inhoneJPG給替換掉如果這個圖片是由用戶可自定義輸入的話&#xff0c;可xss漏洞應用。因為這段代碼本質邏輯是點擊刷新之后。就執行update方法中的代碼&#xff0c;而這個方法中存儲的是。截取IMG&#xff0…

WPS--專業pj版

下載 下載鏈接 解壓后 安裝 默認安裝 激活 輸入解壓后文件中的激活碼

Android Framework智能座艙面試題

目錄 1.談一談你對binder機制的理解?它為什么是Android中最重要的IPC通信方式?與其他IPC(Socket、共享內存)通信方式相比有哪些優勢? 2.如果你需要新提供的車載硬件(比如:一個座椅震動馬達)提供系統級別支持應該怎么做? 3.你了解Android與QNX共存方案的實現方式嗎?他們…

[CISCN2019 華北賽區 Day1 Web1]Dropbox

TRY 首先上傳和刪除文件抓包&#xff0c;可以發現upload.php和delete.php&#xff0c;只允許上傳gif png jpg后綴的文件。但是上傳的文件并沒有辦法訪問&#xff0c;不過可以下載&#xff0c;抓包發現下載的時候請求體是文件名&#xff0c;嘗試能不能通過路徑穿越獲取源碼&…

網站管理后臺

這里套用的模板為 楓雨在線 在寶塔面板左側選擇菜單欄文件 在根目錄下找到www文件夾&#xff0c;點擊進入wwwroot文件夾&#xff0c;隨后能看到域名文件夾&#xff0c;里面有一下初始內容&#xff0c;可以全部刪掉&#xff0c;留下 .user.ini 文件 點擊上傳&#xff0c;將…

一款免費易用且打造的全功能媒體播放器

zyfun[zyplayer]是一款免費易用且打造的全功能媒體播放器, 致力于提供流暢、高效的跨平臺娛樂體驗。 注意&#xff1a;播放源請自行查詢&#xff0c;或者聯系博主。 下載&#xff1a;軟件下載 在線體驗可暫時使用:https://tv.snowytime.cn 密碼為123456 &#x1f389; 功能亮點…

【AI產品思路】AI 原型設計工具橫評:產品經理視角下的 v0、Bolt 與 Lovable

本文原創作者&#xff1a;姚瑞南 AI-agent 大模型運營專家/音樂人/野生穿搭model&#xff0c;先后任職于美團、獵聘等中大廠AI訓練專家和智能運營專家崗&#xff1b;多年人工智能行業智能產品運營及大模型落地經驗&#xff0c;擁有AI外呼方向國家專利與PMP項目管理證書。&#…