數據結構(5)單鏈表算法題(中)

一、合并兩個有序鏈表

1、題目描述?

https://leetcode.cn/problems/merge-two-sorted-lists

?2、算法分析

這道題和之前的合并兩個有序數組的思路很像,創建空鏈表即可,可以很輕松地寫出如下代碼。

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
typedef struct ListNode ListNode;
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) 
{if(list1 == NULL){return list2;}if(list2 == NULL){return list1;}//創建空鏈表ListNode* newHead = NULL;ListNode* newTail = NULL;ListNode* l1 = list1;ListNode* l2 = list2;while(l1 && l2){if(l1->val >= l2->val){//l2尾插到新鏈表中if(newHead == NULL){newHead = newTail = l2;}else{//鏈表非空newTail->next = l2;newTail = newTail->next;}l2 = l2->next;}else{//l1尾插到新鏈表中if(newHead == NULL){newHead = newTail = l1;}else{newTail->next = l1;newTail = newTail->next;}l1 = l1->next;}}//要么l1為空,要么l2為空if(l1)newTail->next = l1;if(l2)newTail->next = l2;return newHead;
}

雖然這個代碼可以運行通過,但有個很嚴重的問題——太過冗余!雖然我們可以將尾插的代碼封裝成函數來解決,但是這里我提供一個更好的方法。導致代碼冗余的根本原因就在于我們創建的是一個空的新鏈表,因此要進行if…else…語句判斷,那我直接一開始向系統申請一塊空間,創建新的非空的鏈表不就可以了。至于新的非空鏈表的val值是什么,我們不用在乎,因為這個非空鏈表起的是一個占位置的作用(在后續的鏈表學習中,這種起到占位置作用的節點,我們稱之為“哨兵位”)。所有節點按題目要求尾插完成后,新鏈表就是如下圖所示的樣子:

這里要注意,我們此時不能返回newHead,而是應該返回newHead的下一個節點才對。并且我們向系統申請的空間在結束后也要釋放(雖然在OJ平臺上是否釋放不會影響整體程序,但還是要養成好習慣~)

3、參考代碼

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
typedef struct ListNode ListNode;
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) 
{if(list1 == NULL){return list2;}if(list2 == NULL){return list1;}//創建非空鏈表ListNode* newHead, *newTail;newHead = newTail = (ListNode*)malloc(sizeof(ListNode));ListNode* l1 = list1;ListNode* l2 = list2;while(l1 && l2){if(l1->val >= l2->val){//l2尾插到新鏈表中newTail->next = l2;newTail = newTail->next;l2 = l2->next;}else{//l1尾插到新鏈表中newTail->next = l1;newTail = newTail->next;l1 = l1->next;}}//要么l1為空,要么l2為空if(l1){newTail->next = l1;}if(l2){newTail->next = l2;}ListNode* retHead = newHead->next;free(newHead);newHead = NULL;return retHead;
}

二、鏈表的回文結構

1、題目描述

https://www.nowcoder.com/share/jump/1753713495724

2、算法分析?

提到回文結構,我們會很自然地想到去定義兩個指針,一個指向頭,一個指向尾,比較兩個值是否相等,再讓頭指針往后走,尾指針往前走。但這道題是一個單向鏈表,尾指針沒有辦法往前走。所以這個方法不太行。那我們又想到,找到中間位置,從中間位置向兩邊走,但是同理還是不行。既然在鏈表中我們無法判斷是否回文,那我們創建一個新數組,把鏈表的值遍歷到新數組中,在數組中判斷回文結構不就可以了嗎?這里注意,題目中明確指出空間復雜度為O(1),因此這里我們創建一個定長數組arr[900]即可。(題目說了保證鏈表長度小于等于900)

根據上述思路,給出參考代碼如下:

/*
struct ListNode {int val;struct ListNode *next;ListNode(int x) : val(x), next(NULL) {}
};*/
class PalindromeList 
{
public:bool chkPalindrome(ListNode* A) {//創建數組int arr[900] = {0};//遍歷鏈表,將鏈表中的值保存在數組中ListNode* pcur = A;int i = 0;while(pcur){arr[i] = pcur->val;i++;pcur = pcur->next;}//判斷數組是否為回文結構int left = 0;int right = i - 1;while(left < right){if(arr[left] != arr[right]){return false;}left++;right--;}return true;}
};

但是這個方法畢竟是應試,有點“投機取巧”,所以這里給出更嚴謹、更合理的方法。

思路2:找鏈表的中間結點,將中間節點作為新的鏈表的頭結點進行反轉鏈表。

3、參考代碼

/*
struct ListNode {int val;struct ListNode *next;ListNode(int x) : val(x), next(NULL) {}
};*/
class PalindromeList {
public://找中間節點ListNode* middleNode(ListNode* head){ListNode* slow, *fast;slow = fast = head;while(fast && fast->next){slow = slow->next;fast = fast->next->next;}return slow;}//反轉鏈表ListNode* reverseList(ListNode* head){if(head == nullptr){return head;}ListNode* n1, *n2, *n3;n1 = nullptr;n2 = head;n3 = n2->next;while(n2){n2->next = n1;n1 = n2;n2 = n3;if(n3){n3 = n3->next;}}return n1;}bool chkPalindrome(ListNode* A) {//找中間節點ListNode* mid = middleNode(A);//反轉中間節點之后的鏈表ListNode* right = reverseList(mid);//遍歷原鏈表和反轉之后的鏈表ListNode* left = A;while(right){if(left->val != right->val){return false;}left = left->next;right = right->next;}return true;}
};

三、相交鏈表?

1、題目描述

https://leetcode.cn/problems/intersection-of-two-linked-lists

?

2、算法分析?

思路:求兩個鏈表的長度并計算長度差,長鏈表先走長度差步,然后兩個鏈表同時往后遍歷。

3、參考代碼

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
typedef struct ListNode ListNode;
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) 
{//求兩個鏈表的長度ListNode* pa = headA;ListNode* pb = headB;int sizeA = 0, sizeB = 0;while(pa){sizeA++;pa = pa->next;}while(pb){sizeB++;pb = pb->next;}//計算長度差int gap = abs(sizeA - sizeB);//abs函數:用于求絕對值//讓長鏈表先走gap步ListNode* shortList = headA;ListNode* longList = headB;if(sizeA > sizeB){longList = headA;shortList = headB;}while(gap--){longList = longList->next;}//longList和shortList在同一起跑線while(shortList){if(longList == shortList){return longList;}shortList = shortList->next;longList = longList->next;}return NULL;
}

?

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

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

相關文章

園區網絡搭建實驗

跟著B站上的老師&#xff0c;用華為ensp模擬搭建了一個園區網絡&#xff0c;感覺挺好玩的雖然老師說這個很簡單&#xff0c;但還是比我公司里的拓撲復雜LSW3配置上行端口3/4配置為串口&#xff0c;下行端口1/2為access口用于連接終端[Huawei]vlan batch 10 20 --創建vlan [Hua…

【tips】小程序css ?號樣式

上傳的時候一般頁面顯示的是加號。不用圖片可以用樣式實現&#xff1b;wxss&#xff1a; /* 加號 */ .plus-box {width: 91rpx;height: 91rpx;border-radius: 6rpx;background: rgba(204, 204, 204, 1);position: relative; /* 用于定位加號 */ }/* 水平線條 */ .plus-box::bef…

MCU中的GPIO(通用輸入/輸出)是什么?

MCU中的GPIO(通用輸入/輸出)是什么? GPIO(General-Purpose Input/Output,通用輸入/輸出)是微控制器(MCU)或嵌入式系統中的一種可編程數字接口,用于與外部設備進行簡單的高低電平信號交互。它是最基礎、最常用的外設之一,廣泛應用于按鍵檢測、LED控制、傳感器通信等場…

echarts 之 datazoom Y軸縮放

如果想 y 軸也能夠縮放&#xff0c;那么在 y 軸上也加上 dataZoom 組件const dataZoomY ref([{type: "slider",yAxisIndex: 0,startValue: 0,endValue: 9,filterMode: "empty",width: 10,height: "80%",showDataShadow: false,left: 5,},{type:…

(四)Python基礎入門-核心數據結構

概覽 列表操作&#xff08;增刪改查/切片/推導式&#xff09;元組特性與不可變性字典操作&#xff08;鍵值對/嵌套字典&#xff09;集合運算&#xff08;交集/并集/差集&#xff09; Python的核心數據結構是編程的基石&#xff0c;本文將系統講解列表、元組、字典和集合四大數…

FCN語義分割算法原理與實戰

FCN語義分割算法原理與實戰 本文若有舛誤&#xff0c;尚祈諸君不吝斧正&#xff0c;感激不盡。 前提概要&#xff1a;所使用的材料來源 對應視頻材料&#xff1a;FCN語義分割 雖然可能比較簡單但是奠定了使用卷積神經網絡做語義分割任務的基礎。 語義分割&#xff1a;輸入圖片…

堆的理論知識

1 引入1.1 普通二叉樹不適合用數組存儲的原因普通二叉樹的結構是 “不規則” 的 —— 節點的左右孩子可能缺失&#xff0c;且缺失位置無規律。 若用數組存儲&#xff08;按 “層次遍歷順序” 分配索引&#xff0c;即根節點放索引 0&#xff0c;根的左孩子放 1、右孩子放 2&…

【python實用小腳本-161】Python Json轉Xml:告別手敲標簽——一行命令把配置秒變可導入的XML

Python Json轉Xml&#xff1a;告別手敲標簽——一行命令把配置秒變可導入的XML 關鍵詞&#xff1a;json轉xml、零依賴腳本、自動生成標簽、小白友好、跨平臺故事開場&#xff1a;周五下午&#xff0c;老板又甩來“配置翻譯”任務 17:55&#xff0c;你正準備關機&#xff0c;老板…

WisFile(文件整理工具) v1.2.19 免費版

下載&#xff1a;https://pan.quark.cn/s/db99b679229fWisFile是一款免費AI文件管理工具&#xff0c;可以在電腦本地運行。它專注于解決文件命名混亂、歸類無序和手動整理耗時的問題。通過AI技術智能識別文件內容&#xff0c;支持批量重命名和智能分類歸檔功能&#xff0c;可自…

簡歷美容院:如何把“打雜經歷“包裝成“核心項目“?

簡歷美容院&#xff1a;如何把"打雜經歷"包裝成"核心項目"&#xff1f; 大家好&#xff0c;我是程序員小白條&#xff0c;今天來研究下簡歷包裝的事&#xff0c;小白可以按我的包裝流程走&#xff0c;可以分步驟進行包裝&#xff0c;具體怎么進行可以看正文…

零基礎-動手學深度學習-7.7 稠密連接網絡(DenseNet)

ResNet極大地改變了如何參數化深層網絡中函數的觀點。 稠密連接網絡&#xff08;DenseNet&#xff09;在某種程度上是ResNet的邏輯擴展。讓我們先從數學上了解一下。 7.7.1. 從ResNet到DenseNet 7.7.2. 稠密塊體 DenseNet使用了ResNet改良版的“批量規范化、激活和卷積”架構…

Marin說PCB之POC電路layout設計仿真案例---09

好消息&#xff0c;好消息&#xff0c;小編最愛的國漫凡人修仙傳電視劇版本的終于可以看了&#xff0c;小編我推薦一波啊&#xff0c;感興趣的道友們可以去某酷視頻去追劇啊。 好了&#xff0c;咱們言歸正傳啊。本期的案例是這個月中旬我們組的測試大哥阿永去某田實驗室去測試我…

論文閱讀--射頻電源在半導體領域的應用

《射頻電源在半導體領域的應用》 論文信息&#xff1a;左政,馮國楠,李建慧,等.射頻電源在半導體領域的應用[J].軟件和集成電路,2025,(04):38-43.DOI:10.19609/j.cnki.cn10-1339/tn.2025.04.007. 一、射頻電源的定義與分類 1.1 定義射頻電源&#xff08;RF Power Supply&#xf…

綠算技術攜手昇騰發布高性能全閃硬盤緩存設備,推動AI大模型降本增效

在數字化浪潮席卷全球的今天&#xff0c;人工智能已經成為推動企業創新與發展的重要力量。廣東省綠算技術有限公司&#xff08;簡稱“綠算技術”&#xff09;緊跟時代步伐&#xff0c;基于華為昇騰AI大模型&#xff0c;推出了高性能全閃硬盤緩存設備&#xff0c;致力于為人工智…

HoloLens2系列講解 - 06 基本操作

一、導入MRTK插件 1. 首先要新建一個項目,打開unity,新建一個project。 2. 導入MRTK包。 3. 點擊 Mixed Reality Toolkit > Add to scene and Configure 添加MR場景配置文件。

Linux Vim 編輯器使用指南

Linux Vim 編輯器使用指南一、Vim 簡介 Vim&#xff08;Vi IMproved&#xff09;是 Linux/Unix 系統中最流行的文本編輯器之一&#xff0c;它是 Vi 的增強版&#xff0c;支持多模式操作、語法高亮、插件擴展等特性&#xff0c;無需鼠標即可高效編輯文本。 二、核心工作模式 Vim…

運維筆記:破解 VMware 遷移難題

一、VMware 遷移前的準備與評估1.1 遷移場景與目標分析VMware 遷移常見場景包括&#xff1a;同平臺升級&#xff1a;從 vSphere 6.7 遷移到 7.0/8.0&#xff08;硬件兼容、功能迭代&#xff09;跨平臺遷移&#xff1a;VMware→KVM/Xen&#xff08;降低 licensing 成本&#xff…

cartographer 點云數據的預處理

目錄 傳感器數據的走向 體素濾波與之后的處理 3D情況下的激光雷達數據的預處理 初始位姿估計 位姿推測器的優缺點分析與總結 可能有問題的點 可能的改進建議 傳感器數據的走向 傳感器數據從CollatedTrajectoryBuilder類的HandleCollatedSensorData函數 傳遞GlobalTrajec…

基于數據挖掘的短視頻點贊影響因素分析【LightGBM、XGBoost、隨機森林、smote】

文章目錄有需要本項目的代碼或文檔以及全部資源&#xff0c;或者部署調試可以私信博主項目介紹總結每文一語有需要本項目的代碼或文檔以及全部資源&#xff0c;或者部署調試可以私信博主 項目介紹 隨著短視頻行業的高速發展&#xff0c;尤其是以抖音為代表的平臺不斷壯大&…

Git 從入門到精通

Git 從入門到精通 涵蓋了核心概念、常用命令、協作流程和高級技巧&#xff1a; 核心理念&#xff1a; 版本控制&#xff1a; 記錄文件變化歷史&#xff0c;可回溯到任意版本。分布式&#xff1a; 每個開發者擁有完整的倉庫副本&#xff08;包括完整歷史&#xff09;&#xf…