LeetCode/NowCoder-鏈表經典算法OJ練習3

??孜孜不倦:孜孜:勤勉,不懈怠。指工作或學習勤奮不知疲倦。💓💓💓

目錄

說在前面

題目一:返回倒數第k個節點

題目二:鏈表的回文結構

題目三:相交鏈表

SUMUP結尾


說在前面

?dear朋友們大家好!💖💖💖數據結構的學習離不開刷題,在對鏈表的相關OJ進行練習后又更新復雜度的OJ,這并不意味這鏈表的題目就結束了,我們今天就繼續聯系鏈表相關的OJ練習當今天我們的題目除了LeetCode,還來自NowCoder。

?👇👇👇

友友們!🎉🎉🎉點擊這里進入力扣leetcode學習🎉🎉🎉


?以下是leetcode題庫界面:

?

?👇👇👇

🎉🎉🎉點擊這里進入牛客網NowCoder刷題學習🎉🎉🎉
?以下是NowCoder題庫界面:

??

???

題目一:返回倒數第k個節點

題目鏈接:面試題 02.02. 返回倒數第 k 個節點 - 力扣(LeetCode)

題目描述:

?

題目分析:

?思路1:將創建一個數組temp,將鏈表中節點的地址存入數組temp,再返回數組中下標為n-k的地址所指向的數據。

舉例:1->2->3->4->5->6? 和 k = 3

?

代碼如下:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
#define numsSize 100
typedef struct ListNode ListNode;
int kthToLast(struct ListNode* head, int k) {ListNode* pcur = head;ListNode* temp[numsSize];//創建臨時數組int i = 0;while (pcur != NULL)//將鏈表節點地址存入數組temp{temp[i++] = pcur;pcur = pcur->next;}return temp[i - k]->val;//返回倒數第k個節點的數據
}

不過,假設鏈表很長,此時空間復雜度就會比較高,所以用numsSize固定長度顯然不是好的辦法,應該用動態內存分配的辦法來初始化temp

代碼如下:

 /*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
typedef struct ListNode ListNode;
int kthToLast(struct ListNode* head, int k) {ListNode* pcur = head;int length = 0;while (pcur != NULL)//遍歷數組,得到節點的個數{length++;pcur = pcur->next;}//動態創建二級指針變量tempListNode** temp = (ListNode**)malloc(length * sizeof(ListNode*));pcur = head;int i = 0;while (pcur != NULL)//將鏈表節點地址存入temp{temp[i++] = pcur;pcur = pcur->next;}return temp[i - k]->val;//返回倒數第k個節點的數據
}

不過顯然空間復雜度為O(N),不是一個非常好的辦法。如果給出前提條件:空間復雜度為O(1),這個方法就不行了。

?思路2:將創快慢指針法:定義快慢指針fast、slow,先讓fast走k步,再讓slow和fast同時走,這樣當fast走完slow剛好指向倒數第k個節點。

舉例:1->2->3->4->5->6? 和 k = 3

?

代碼如下:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
typedef struct ListNode ListNode;
int kthToLast(struct ListNode* head, int k) {//定義快慢指針ListNode* slow = head;ListNode* fast = head;while (k--)//讓fast先走k步{fast = fast->next;}//當fast走完,此時slow指向的就是倒數第k個節點while (fast != NULL){fast = fast->next;slow = slow->next;}return slow->val;
}

???

題目二:鏈表的回文結構

題目鏈接:鏈表的回文結構_牛客題霸_牛客網 (nowcoder.com)

題目描述:

?

題目分析:

?思路:先找到鏈表的中間節點,再將鏈表的后半部分反轉,比較前半部分和后半部分的元素是否相等。

我們需要用到之前OJ練習1中的兩個函數:


1.鏈表的中間節點:876. 鏈表的中間結點 - 力扣(LeetCode)

2.反轉鏈表:206. 反轉鏈表 - 力扣(LeetCode)

如果忘記了,大家點擊這里復習:LeetCode/NowCoder-鏈表經典算法OJ練習1

代碼如下:

/*struct ListNode {int val;struct ListNode *next;ListNode(int x) : val(x), next(NULL) {}
};*/
class PalindromeList {
public://尋找鏈表的中間節點struct ListNode* middleNode(struct ListNode* head){struct ListNode* slow = head;struct ListNode* fast = head;while (fast && fast->next){slow = slow->next;fast = fast->next->next;}return slow;}//反轉鏈表struct ListNode* reverseList(struct ListNode* head) {if (head == NULL)return NULL;struct ListNode* n1 = NULL;struct ListNode* n2 = head;struct ListNode* n3 = head->next;while (n2){n2->next = n1;n1 = n2;n2 = n3;if (n3)n3 = n3->next;}return n1;}bool chkPalindrome(ListNode* A) {//尋找鏈表的中間節點struct ListNode* mid = middleNode(A);//反轉鏈表后半段struct ListNode* rmid = reverseList(mid);while (rmid && A)//比較前后段是否相同{if (rmid->val != A->val)return false;rmid = rmid->next;A = A->next;}return true;}
};

像這種題屬于組合體,比較綜合,同時也告訴我們具有一定功能的代碼在下次使用時可以稍加修改再Ctrl+C/V,可以省去很多麻煩,也比較方便。??

???

題目三:相交鏈表

題目鏈接:160. 相交鏈表 - 力扣(LeetCode)

題目描述:

題目分析:

思路:這題比較復雜,我們需要模塊化思考。同時注意單鏈表相交為"Y"型而不可能為"X"型,因為單鏈表沒有兩個next指針。

1、如何判斷相交?

判斷尾指針,如果尾指針地址相同則相交(注意,不能用尾節點所存儲的值是否相同判斷,因為之前有可能也有節點存儲了和尾節點相同的值)。

2、若相交,如何找出第一個交點?

思路1:A鏈表的節點依次和B鏈表的所有節點比較,A的某個節點和B鏈表的某個節點相等,則這個節點就是交點。

?代碼如下:

/*** 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* cur1 = headA;ListNode* cur2 = headB;//讓A、B鏈表都走到尾節點while(cur1->next){cur1 = cur1->next;}while(cur2->next){cur2 = cur2->next;}if(cur1 != cur2)//判斷尾節點是否相等return NULL;cur1 = headA;while(cur1->next)//讓A中每個節點都和B中的所有節點比較{cur2 = headB;while(cur2->next){if(cur1 == cur2)//第一個相等的就是交點return cur2;cur2 = cur2->next;}cur1 = cur1->next;}   return cur2;
}

這個方法的時間復雜度為O(N^2)

思路2:分別計算出鏈表A、B的長度,讓長的先走差距的步數,然后再讓兩鏈表同時開始走,第一個相等的就是交點。

代碼如下:

/*** 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* cur1 = headA, * cur2 = headB;int lenA = 0;int lenB = 0;while (cur1->next)//統計鏈表A的長度{lenA++;cur1 = cur1->next;}while (cur2->next)//統計鏈表B的長度{lenB++;cur2 = cur2->next;}if (cur1 != cur2)//判斷是否有交點return NULL;//假設法,設置長短鏈表ListNode* LongList = headA, * ShortList = headB;if (lenA < lenB){LongList = headB;ShortList = headA;}int gap = abs(lenA - lenB);//兩鏈表節點差值while (gap--)//讓長的先走差值的步數{LongList = LongList->next;}while (LongList != ShortList)//讓兩鏈表一起走,第一個相等的就是交點{LongList = LongList->next;ShortList = ShortList->next;}return LongList;
}

這個方法的時間復雜度為O(N)

對比兩種解法,顯然第二種方法是更好的。?

?

SUMUP結尾

數據結構就像數學題,需要刷題才能對它有感覺。之后還會更新數據結構相關的練習題、面試題,希望大家一起學習,共同進步~

如果大家覺得有幫助,麻煩大家點點贊,如果有錯誤的地方也歡迎大家指出~

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

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

相關文章

Pytorch: 解決因pytorch版本不同 導致訓練ckpt加載失敗

大家都會遇到在工程項目實施階段&#xff0c;如果訓練的模型文件在不同的torch版本環境下部署時&#xff0c;會報錯~。 報錯舉例 # 查看torch環境 import torch print(torch.__version__)# 訓練時環境&#xff1a;torch 1.8.2cu111 # 部署時環境&#xff1a;torch 1.4.0torch.…

dcatAdmin框架 使用phpword 生成word文件

下載phpword插件 composer require phpoffice/phpword 生成word文件接口 static public function word(){//接收傳值$order_id request()->get(order_id);$tpl_id request()->get(tpl_id);//查詢出對應的數據以及關聯數據$sale_order \App\Models\SaleOrder::with([…

Python異步編程之基礎概念

Python異步編程之基礎概念 在現代編程中&#xff0c;異步編程是一種重要的技術&#xff0c;尤其是在處理I/O密集型任務時&#xff0c;異步編程可以大大提高程序的性能和響應速度。本文將介紹Python異步編程的基礎概念&#xff0c;幫助你理解其原理和應用。 什么是異步編程&am…

【代碼隨想錄算法訓練營第37期 第十七天 | LeetCode110.平衡二叉樹、257. 二叉樹的所有路徑、404.左葉子之和】

代碼隨想錄算法訓練營第37期 第十七天 | LeetCode110.平衡二叉樹、257. 二叉樹的所有路徑、404.左葉子之和 一、110.平衡二叉樹 解題代碼C&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *righ…

三、NVIDIA Jetson Orin開發板-GPU加速

一、NVIDIA Jetson Orin開發板的硬件情況 df -h#查看操作系統情況Filesystem Size Used Avail Use% Mounted on **/dev/nvme0n1p1** 234G 17G 208G 8% / none 7.4G 0 7.4G 0% /dev tmpfs 7.6G 0 7.6G 0% /dev/shm tmpfs …

LeetCode 2644.找出可整除性得分最大的整數:暴力模擬(兩層循環)

【LetMeFly】2644.找出可整除性得分最大的整數&#xff1a;暴力模擬&#xff08;兩層循環&#xff09; 力扣題目鏈接&#xff1a;https://leetcode.cn/problems/find-the-maximum-divisibility-score/ 給你兩個下標從 0 開始的整數數組 nums 和 divisors 。 divisors[i] 的 …

MySQL庫/表/數據的操作

文章目錄 1.數據庫操作1.1 創建、刪除、查看和修改1.2 編碼格式1.3 備份和恢復 2.表的操作2.1 創建表2.2 存儲引擎2.3 查看表、修改表、刪除表 3.數據類型3.1整數類型3.2字節類型(bit)3.3浮點類型(bit)3.4 decimal3.5 字符串類型3.6 日期和時間類型3.7 enum和set關于如何查找想…

webpack 學習之 五大核心

為什么用 webpack webpack 官網傳送門 … 官網&#xff1a;webpack 是一個用于現代 JavaScript 應用程序的 靜態模塊打包工具。將你項目中所需的每一個模塊組合成一個或多個 bundles&#xff0c;它們均為靜態資源&#xff0c;用于展示你的內容。總結&#xff1a;匯總所有模塊…

Python中別再用 ‘+‘ 拼接字符串了!

大家好&#xff0c;在 Python 編程中&#xff0c;我們常常需要對字符串進行拼接。你可能會自然地想到用 操作符將字符串連接起來&#xff0c;畢竟這看起來簡單明了。 在 Python 中&#xff0c;字符串是不可變的數據類型&#xff0c;這意味著一旦字符串被創建&#xff0c;它就…

【Python】—— lambda表達式

目錄 &#xff08;一&#xff09;應用場景 &#xff08;二&#xff09;lambda 語法 &#xff08;三&#xff09;示例分析 &#xff08;四&#xff09;lambda參數形式 4.1 無參數 4.2 一個參數 4.3 默認參數 4.4 可變參數 &#xff1a;*args 4.5 可變參數 &#xff1a;…

【Python爬蟲】案例_github模擬登錄

import requests import re from datetime import datetimedef login():sessionrequests.session()session.headers {User-Agent :XXXX #寫自己的}url1 https://github.com/loginres_1 session.get(url1).content.decode()token re.findall(name"authenticity_token&q…

基于Matlab實現BP神經網絡的手寫數字識別

歡迎大家點贊、收藏、關注、評論啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代碼。 文章目錄 一項目簡介 二、功能三、系統四. 總結 一項目簡介 一、項目背景與意義 手寫數字識別是計算機視覺和模式識別領域的一個經典問題&#xff0c;具有廣泛的應用場景&…

信息安全從業者書單推薦

作為一名網安人&#xff0c;身上肩負的責任是很大的&#xff0c;能力越大&#xff0c;責任也越大&#xff0c;反過來責任越大&#xff0c;能力也必須跟得上。不管是想進這行&#xff0c;還是已經在這行&#xff0c;持續學習肯定是不能缺少的&#xff0c;除了在工作中積累&#…

qt多語言翻譯不生效的原因

假設您有QT語言家的基礎知識&#xff0c;假設網上那些所有的問題您都已經排查過了&#xff0c;但依然翻譯不生效&#xff0c;那么可以看下這篇帖子&#xff0c;其實就一個問題&#xff0c;變量的生命周期&#xff0c;假設QTranslator是一個函數內的變量&#xff0c;且沒有被聲明…

億圖圖示——刪除水印

一、文件以PPT格式導出 二、點擊水印所在區域&#xff0c;點擊多次delete鍵 三、調整PPT頁面尺寸 四、轉成PDF 五、PDF轉成圖片

Spring的Profile功能及其應用場景

Spring的Profile功能是一種條件化配置機制&#xff0c;它允許開發者根據不同的運行環境或條件來定義和使用不同的bean和配置。Profile功能使得Spring應用程序可以靈活地適應不同的部署場景&#xff0c;而無需修改代碼。 Profile功能的作用&#xff1a; 環境隔離&#xff1a;可…

從0開始寫一個環境保護網站的第3天(JAVAWEB)

1.目標 實現首頁的環境保護原因的查詢&#xff0c;和底部友情連接部分 2.實現 2.1建立數據庫表格&#xff08;這里數據全是百度查詢&#xff09; 環境保護原因表&#xff1a; 友情連接表&#xff1a;&#xff08;數據來源https://zhuanlan.zhihu.com/p/696243646&#xff0…

SqlSession是什么?在MyBatis-Spring中有什么應用?

目錄 一、SqlSession是什么 二、SqlSession在MyBatis中的應用 三、SqlSession在Spring中的應用 一、SqlSession是什么 SqlSession 是 MyBatis 框架中的一個核心概念&#xff0c;它代表與數據庫的一次會話。MyBatis 是一個流行的 Java 持久層框架&#xff0c;用于簡化數據庫…

c++題目_農場和奶牛

&#x1d435;B 頭奶牛 (1≤&#x1d435;≤25000)(1≤B≤25000)&#xff0c;有 &#x1d441;(2&#x1d435;≤&#x1d441;≤50000)N(2B≤N≤50000) 個農場&#xff0c;編號 11 到 &#x1d441;N&#xff0c;有 &#x1d440;(&#x1d441;?1≤&#x1d440;≤100000)M(…

【Linux】fork和exec中的信號繼承探索

fork和exec中的信號繼承探索 一、結論二、代碼驗證2.1 代碼編寫2.2 代碼執行 三、linux源碼驗證四、APUE中的驗證五、其他 一、結論 fork時子進程會繼承父進程的信號處理方式&#xff0c;包括父進程設置信號為SIG_DFL或SIG_IGN或捕獲后設置自定義處理函數。exce時子進程會繼承…