單鏈表經典oj題(2)

前言

這次將要把剩下的oj題將以圖解和自己的理解把它講解完,希望對大家有所幫助,這次的講解也是干貨

第一題

21. 合并兩個有序鏈表 - 力扣(LeetCode)

ok這次就簡單點,大家自己去看題目了

將兩個升序鏈表合并為一個新的?升序?鏈表并返回。新鏈表是通過拼接給定的兩個鏈表的所有節點組成的。?

暴力思路

想想看不考慮空間和時間的消耗,什么代碼最容易想

兩個鏈表,可不可以直接把兩個鏈表的值放在一個數組中

然后再排序,當然這里的鏈表大小是有序的,放在數組中時

可以判斷大小,從而不用去排序

再根據數組自行去malloc一個鏈表,是不是非常暴力的思路

這個暴力代碼其實也很重要,至少是算法小白入門的絕招

#include<stdio.h>
#include<stdlib.h>
typedef struct SlistNode {struct SlistNode* next;int val;
}SLNode,*SL;
SLNode* Buyslistnode(int data)
{SL newnode = (SL)malloc(sizeof(SLNode));newnode->next = NULL;newnode->val = data;return newnode;
}
SL initlist1()
{SL list1 = (SL)malloc(sizeof(SLNode));list1->val = 1;list1->next = Buyslistnode(2);list1->next->next = Buyslistnode(4);return list1;
}
SL initlist2()
{SL list2 = (SL)malloc(sizeof(SLNode));list2->val = 1;list2->next = Buyslistnode(3);list2->next->next = Buyslistnode(4);return list2;
}
int cmp(const void* p1, const void* p2)
{return *(int*)p1 - *(int*)p2;
}
void text1()
{//我們這里直接考慮list1與list2都不是空鏈表的情況//其實其他的情況可以通過if判斷排除//初始化題目//list1   1->2->4//list2   1->3->4SL list1 = initlist1();SL list2 = initlist2();//題目中鏈表的結點數是0~50//所以直接可以用靜態數組int newarr[110];int size = 0;while (list1){newarr[size++] = list1->val;list1 = list1->next;}while (list2){newarr[size++] = list2->val;list2 = list2->next;}qsort(newarr, size, sizeof(int), cmp);SL phead = (SL)malloc(sizeof(SLNode));SL cur = phead;for (int i = 0; i < size; i++){cur->next = Buyslistnode(newarr[i]);cur = cur->next;}//至此已經完成//打印看結果吧cur = phead->next;while (cur){printf("%d ", cur->val);cur = cur->next;}
}
int main()
{text1();return 0;
}

那么看結果

OK接下來看看優化的思路 頭結點+雙頭插

對于這個例子

我們一第二條鏈表為基礎對他進行插入操作

我們使用兩個指針,分別指向兩條鏈表的第一個位置cur1 cur2

如果第一個鏈表的值小于第二個鏈表的值那么尾插到此時第二個鏈表指針的前面

cur1->val<=cur2->val? ? ??

并且讓第一個指針cur1=cur1->next;

當然這里只是大題思路不是代碼

如果大于?cur1->val>cur2->val? ?

那么讓cur2=cur2->next

在進行操作的時候,我們為了避免在第一個位置插入?,從而加入了頭指針

OK,看代碼唄

struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {if(list1==NULL&&list2==NULL)return list1;else if(list1!=NULL&&list2==NULL)return list1;else if(list1==NULL&&list2!=NULL)return list2;struct ListNode*p1=list1;struct ListNode*p2=list2;struct ListNode*p2head=(struct ListNode*)malloc(sizeof(struct ListNode));p2head->next=p2;struct ListNode*front=p2head;while(p1&&p2){if(p1->val<=p2->val){//雙指針中間插入//front->next=p1;struct ListNode*temp=p1;p1=p1->next;temp->next=p2;front=temp;}else{front=p2;p2=p2->next;}}//如果p2==null此時p1不為空,把p1接起來if(p2==NULL)front->next=p1;return p2head->next;}

?第二題

現有一鏈表的頭指針 ListNode*?pHead,給一定值x,編寫一段代碼將所有小于x的結點排在其余結點之前,且不能改變原來的數據順序,返回重新排列后的鏈表的頭指針。

鏈表分割_牛客題霸_牛客網 (nowcoder.com)

ok

這個題目其實也可以暴力

但是

已經寫了好多次暴力了,對吧

這一次可以說說思路

仍然可以使用數組,然后直接排序,不管x為多少,按從小到大的順序,沒有錯

然后構建鏈表,這個題目就完了

挺暴力的吧

可以的

但是這個代碼和之前大差不差

直接來看具體的思路

我們可以把一個鏈表分成兩個鏈表,list1一個是大于等于x的,list2一個是小于x的

最后讓list2連接list1

就完成任務了

思路看起來簡單但是細節還是很多

我們在代碼中有注釋

class Partition {
public:ListNode* partition(ListNode* pHead, int x) {if(pHead==NULL&&pHead->next==NULL)return pHead;auto *head=(ListNode*)malloc(sizeof(ListNode));head->next=pHead;//頭結點ListNode*front=head;ListNode*newlist=NULL;ListNode*newtail=NULL;ListNode*p=pHead;while(p){if(p->val<x){//在原有的鏈表上去除小于x的值ListNode*temp=p;p=p->next;temp->next=NULL;front->next=p;//對新的鏈表操作//小于x的值重新連成一個鏈表if(newlist==NULL){newlist=newtail=temp;}else{newtail->next=temp;newtail=temp;}}else {front=p;p=p->next;  }}//不要忘了呀,新的鏈表有可能為空呀,哎呦,搞了個半天if(newtail==NULL)return pHead;elsenewtail->next=head->next;return newlist;}
};

這個題目思路還是不難,繼續努力

第三題

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

對于一個鏈表,請設計一個時間復雜度為O(n),額外空間復雜度為O(1)的算法,判斷其是否為回文結構。

給定一個鏈表的頭指針A,請返回一個bool值,代表其是否為回文結構。保證鏈表長度小于等于900。

1->2->2->1
返回:true

這個題目有難度了

所以我們可以通過畫圖來理解一下

思路,

我們可以找到中間的結點,把中間的結點逆置過來

然后一個指針從中間

另一個指針從開頭

一直判斷他們是否相等,就可以得到答案

看圖唄

?OK,找中以及逆轉鏈表之前已經有過講解了

單鏈表的經典oj題(1)-CSDN博客

好吧,不懂可以去看

我們現在直接去看代碼嘍

 ListNode*middle(ListNode*A){ListNode*slow=A;ListNode*fast=A;while(fast&&fast->next){fast=fast->next->next;slow=slow->next;}return slow;}ListNode* revearse(ListNode*src){ListNode* cur=src;ListNode* prev=NULL;while(cur){ListNode* temp=cur->next;cur->next=prev;prev=cur;cur=temp;}return prev;}bool chkPalindrome(ListNode* A) {// write code hereListNode*cur=middle(A);ListNode* tail=revearse(cur);while(A&&tail){if(tail->val!=A->val)return false;tail=tail->next;A=A->next;}return true;}

第四題

給你兩個單鏈表的頭節點?headA?和?headB?,請你找出并返回兩個單鏈表相交的起始節點。如果兩個鏈表不存在相交節點,返回?null?

題目在這里

160. 相交鏈表 - 力扣(LeetCode)

OK

思路

?首先要判斷他們是否是有相交節點

OK可以讓他們走到最后一個節點

如果他們的最后一個節點相等,那他們就有相交節點,那么問題來了

怎么找到節點呢

要是知道兩個鏈表的長度,再利用相對位移讓他們距離相交節點的位移一樣

最后讓他們同時走,再判斷,直到相等即可

OK

看代碼

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {struct ListNode*A =headA;struct ListNode*B =headB;//這里最后一個節點沒有加上,所以初始為1int sizeA=1;int sizeB=1;while(A->next){A=A->next;sizeA++;}while(B->next){B=B->next;sizeB++;}if(A!=B)return NULL;//通過假設,來簡化代碼//總之就是讓A最長if(sizeA<sizeB){A=headB;B=headA;}else{A=headA;B=headB;}int abs=sizeA-sizeB>0?sizeA-sizeB:sizeB-sizeA;//使他們里相交點的距離相等while(abs--){A=A->next;}while(A!=B){A=A->next;B=B->next;}return B;
}

第五題?

?141. 環形鏈表 - 力扣(LeetCode)

題目

給你一個鏈表的頭節點?head?,判斷鏈表中是否有環。

如果鏈表中有某個節點,可以通過連續跟蹤?next?指針再次到達,則鏈表中存在環。 為了表示給定鏈表中的環,評測系統內部使用整數?pos?來表示鏈表尾連接到鏈表中的位置(索引從 0 開始)。注意:pos?不作為參數進行傳遞?。僅僅是為了標識鏈表的實際情況。

如果鏈表中存在環?,則返回?true?。 否則,返回?false?。

示例 1:

輸入:head = [3,2,0,-4], pos = 1
輸出:true
解釋:鏈表中有一個環,其尾部連接到第二個節點

OK

這個題目的思路很重要,我這里有兩種做法

暴力求解

如果只要求求出題目,那么我們可不可以用一個數據來標明這個節點走過沒有

  • -10^5 <= Node.val <= 10^5

當我們走過一個結點

直接給他加上一個10^6+10

+10是防止特殊情況,那么只要遍歷一遍,走到某個節點,如果它大于

10^5證明我們走過這里,但是此時又回到了這里,此時可以判斷為有環

缺點是破壞了鏈表

bool hasCycle(struct ListNode *head) {while(head){if(head->val>1e5)return true;else{head->val+=1e6+10;}head=head->next;}return false;
}

這種辦法還是挺有意思的不是嗎?

OK

來看看不改變鏈表的結構的寫法吧

這個還是要畫圖理解,并且這里還是涉及到了相對位置的概念

bool hasCycle(struct ListNode *head) 
{struct ListNode * slow = head ;struct ListNode * fast = head ;while(fast && fast->next){fast = fast->next->next;slow = slow->next;if(slow == fast)return true;}return false;}

話不多說下一題

第六題

142. 環形鏈表 II - 力扣(LeetCode)

?這個題目,是上個題目的升級版

OK看題

給定一個鏈表的頭節點 ?head?,返回鏈表開始入環的第一個節點。?如果鏈表無環,則返回?null

如果鏈表中有某個節點,可以通過連續跟蹤?next?指針再次到達,則鏈表中存在環。 為了表示給定鏈表中的環,評測系統內部使用整數?pos?來表示鏈表尾連接到鏈表中的位置(索引從 0 開始)。如果?pos?是?-1,則在該鏈表中沒有環。注意:pos?不作為參數進行傳遞,僅僅是為了標識鏈表的實際情況。

不允許修改?鏈表。

示例 1:

輸入:head = [3,2,0,-4], pos = 1
輸出:返回索引為 1 的鏈表節點
解釋:鏈表中有一個環,其尾部連接到第二個節點。

思路

大家看這里就是不允許修改鏈表了

這該如何是好

還是畫圖吧

這個題目更是一個物理的模型

OK,看代碼吧

struct ListNode *detectCycle(struct ListNode *head) {struct ListNode*slow=head;struct ListNode*fast=head;struct ListNode*meet=NULL;struct ListNode*find=head;while(fast&&fast->next){fast=fast->next->next;slow=slow->next;if(fast==slow){meet=slow;break;}}if(meet==NULL)return NULL;while(find!=meet){find=find->next;meet=meet->next;}return find;
}

總結

今天的題還是挺多的,好好練吧

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

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

相關文章

帶有-i選項的sed命令在Linux上執行成功,但在MacOS上失敗了

問題&#xff1a; 我已經成功地使用以下 sed 命令在Linux中搜索/替換文本&#xff1a; sed -i s/old_string/new_string/g /path/to/file然而&#xff0c;當我在Mac OS X上嘗試時&#xff0c;我得到&#xff1a; command i expects \ followed by text我以為我的Mac運行的是…

未授權訪問:Memcached 未授權訪問漏洞

目錄 1、漏洞原理 2、環境搭建 3、未授權訪問 防御手段 今天繼續學習各種未授權訪問的知識和相關的實操實驗&#xff0c;一共有好多篇&#xff0c;內容主要是參考先知社區的一位大佬的關于未授權訪問的好文章&#xff0c;還有其他大佬總結好的文章&#xff1a; 這里附上大…

如何在OpenWrt軟路由中增加一個新功能

為了在OpenWrt中增加一個新的功能&#xff0c;并使其支持 UCI 配置&#xff0c;我們可以創建一個簡單的C語言服務&#xff0c;例如一個簡單的日志服務。此服務將記錄到日志文件中&#xff0c;并支持通過 UCI 配置啟用或禁用日志功能。以下是詳細的步驟和代碼示例。 1 創建服務…

K8S三 K8S部署微服務應用

一 用k8s部署微服務應用 以我們之前用docker部署過的eureka應用為例&#xff0c;首先添加配置文件eureka-app-deployment.yaml用于創建Deployment apiVersion: apps/v1 kind: Deployment metadata:name: eureka-app-deployment # deployment名字labels:app: eureka-app spec:…

【C++】CentOS環境搭建-升級CMAKE

【C】CentOS環境搭建-升級CMAKE CMAKE報錯CMake 3.12 or higher is required. You are running version 2.8.12.2升級步驟1.移除當前的cmake2.安裝必要的構建工具和庫3.下載最新的cmake源碼并解壓5.編譯和安裝6.驗證安裝 CMAKE報錯CMake 3.12 or higher is required. You are r…

oraclesql中刪除表中重復行的方法

在Oracle SQL中&#xff0c;刪除表中的重復行有幾種常見的方法。以下是其中的三種&#xff1a; 使用ROWID: 通過比較ROWID&#xff0c;你可以找到并刪除重復的行。這是因為ROWID是Oracle數據庫為每一行數據分配的唯一標識符。 sql DELETE FROM persons p1 WHERE ROWID NOT…

MySQL存儲引擎詳解

存儲引擎 MySQL體系結構 連接層&#xff1a;與客戶端連接&#xff0c;權限校驗、連接池服務層&#xff1a;SQL接口和解析、查詢優化、緩存、函數引擎層&#xff1a;索引、存儲引擎存儲層&#xff1a;系統文件、日志&#xff08;Redo、Undo等&#xff09; 存儲引擎介紹 不同的…

SSH:安全遠程訪問的基石

SSH&#xff1a;安全遠程訪問的基石 一、引言 在當今這個數字化、網絡化的時代&#xff0c;遠程訪問和管理計算機資源已成為日常工作的重要組成部分。然而&#xff0c;如何在不安全的網絡環境中確保數據傳輸的機密性、完整性和可靠性&#xff0c;成為了一個亟待解決的問題。S…

前端測試策略與實踐:單元測試、E2E測試與可訪問性審計

前端測試策略是確保Web應用程序質量、性能和用戶體驗的關鍵組成部分。有效的測試策略通常包括單元測試、端到端&#xff08;E2E&#xff09;測試以及可訪問性審計等多個層面。以下是關于這三類測試的策略與實踐建議&#xff1a; 單元測試 定義與目的&#xff1a; 單元測試是針…

P2622 關燈問題

小小注解&#xff1a; 1. vis&#xff1a;表示到達該狀態的步數&#xff08;min&#xff09;1&#xff0c; 因為我們是從開始狀態 窮舉&#xff0c;所以每次到一個新狀態&#xff08;之前沒有到過的狀態&#xff09;就是最小步數。 如何判斷是否是一個新狀態呢&#xff0c…

axios常用配置

Axios 是一個基于 promise 的 HTTP 庫&#xff0c;廣泛用于瀏覽器和 node.js 中。以下是一些 Axios 常用的配置選項&#xff1a; url: 字符串&#xff0c;請求的服務器URL&#xff0c;是必填項。method: 請求方法&#xff0c;如 ‘get’, ‘post’, ‘put’, ‘delete’ 等&am…

免費遠程控制軟件哪個好用

免費遠程控制軟件哪個好用 在現今高度信息化的社會&#xff0c;遠程控制軟件已成為許多用戶進行遠程辦公、技術支持和教育培訓的重要工具。市面上有許多免費的遠程控制軟件&#xff0c;但哪款才是最好用的呢&#xff1f;本文將為您介紹幾款熱門的免費遠程控制軟件&#xff0c;…

Tab菜單與下拉式菜單

Tab菜單 利用CSS隱藏或顯示欄目中的部分內容&#xff0c;實際Tab面板包含的全部內容都已下載到客戶端瀏覽器當中。一般Tab面板僅顯示一個Tab菜單項&#xff0c;當用戶點選對應的菜單選項之后&#xff0c;才會顯示對應的內容。 <!DOCTYPE html> <html><head>…

Matlab: ode45解微分方程——以彈簧振子模型為例

簡介&#xff1a; 在科學和工程中&#xff0c;我們經常遇到描述事物變化的微分方程。這些方程可以幫助我們理解從行星運動到藥物在體內的擴散等各種現象。但是&#xff0c;很多微分方程非常復雜&#xff0c;手動求解幾乎不可能。這時&#xff0c;我們就可以使用像 ode45這樣的…

【DL】FocalLoss的PyTorch實現

【DL】FocalLoss的PyTorch實現 此篇不介紹FocalLoss的原理&#xff0c;僅展示PyTorch實現FocalLoss的兩種方式。個人認為相關原理已在文章《FocalLoss原理通俗解釋及其二分類和多分類場景下的原理與實現》中講得很清晰&#xff0c;故此篇不再介紹。 方式一 同時計算一個batc…

【iOS】frame與bounds區別

文章目錄 前言framebounds兩者區別size的區別總結 前言 在學習響應者鏈的過程中用到了frame與bounds的混用&#xff0c;這兩個屬性經常出現在我們的開發中&#xff0c;特別撰寫一篇博客分析區別 首先&#xff0c;我們來看一下iOS特有的坐標系&#xff0c;在iOS坐標系中以左上…

C語言如何查看進程中環境變量中所有的值

示例代碼&#xff1a;查看進程中環境變量中所有的值。 #include <stdio.h>int main(){extern char** environ;for (char** pp environ; *pp; pp){printf("%s\n", *pp);}return 0; }輸出結果&#xff1a; SHELL/bin/bash WSL2_GUI_APPS_ENABLED1 WSL_DISTRO_…

【debug】如何使用pycharm對代碼調試

后續會將所有debug中遇到的知識放入&#xff0c;建議關注收藏 本站友情鏈接&#xff1a; 基本理論專欄&#xff08;當前更新好的debug所有內容都在這里&#xff09; 【debug】報錯解決方法&#xff08;CondaHTTPError&#xff1a;HTTP 000 connection failed for url&#xff…

【回溯 狀態壓縮 深度優先】37. 解數獨

本文涉及知識點 回溯 狀態壓縮 深度優先 LeetCode37. 解數獨 編寫一個程序&#xff0c;通過填充空格來解決數獨問題。 數獨的解法需 遵循如下規則&#xff1a; 數字 1-9 在每一行只能出現一次。 數字 1-9 在每一列只能出現一次。 數字 1-9 在每一個以粗實線分隔的 3x3 宮內只…

leetCode刷題記錄4-面試經典150題-2

文章目錄 不要擺&#xff0c;沒事干就刷題&#xff0c;只有好處&#xff0c;沒有壞處&#xff0c;實在不行&#xff0c;看看競賽題面試經典 150 題 - 2210. 課程表 II 不要擺&#xff0c;沒事干就刷題&#xff0c;只有好處&#xff0c;沒有壞處&#xff0c;實在不行&#xff0c…