數據結構——經典鏈表OJ(二)


樂觀學習,樂觀生活,才能不斷前進啊!!!

我的主頁:optimistic_chen
我的專欄:c語言
點擊主頁:optimistic_chen和專欄:c語言,
創作不易,大佬們點贊鼓勵下吧~

文章目錄

  • 合并兩個有序鏈表
    • 第一種思路
    • 第二種思路
  • 環形鏈表的約瑟夫問題
  • 分割鏈表
    • 第一種思路
    • 第二種思路
  • 完結

合并兩個有序鏈表

合并兩個有序鏈表———力扣
在這里插入圖片描述

第一種思路

直接創建一個空鏈表,分別判斷兩個原鏈表的元素大小,升序插入到新鏈表中,但是此方法可能會超出時間限制(每一次都需要判斷新鏈表的頭節點是否為空),代碼重復執行太多。

typedef struct ListNode ListNode;
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {//判斷為空鏈表if(list1==NULL){return list2;}if(list2==NULL){return list1;}ListNode* l1=list1;ListNode*l2=list2;//創建的新鏈表ListNode*newHead,*newTail;newHead=newTail=NULL;while(l1&&l2){if(l1->val < l2->val){//l1拿下來尾插if(newHead==NULL){newHead=newTail=l2;}else{newTail->next=l1;newTail=newTail->next;}l1=l1->next;}else{//l2拿下來尾插if(newHead==NULL){newHead=newTail=l2;}else{newTail->next=l2;newTail=newTail->next;}l2=l2->next;}}//跳出循環,要么l1先為空,要么l2先為空if(l2){newTail->next=l2;}if(l1){newTail->next=l1;}return newHead;
}

第二種思路

優化:讓新鏈表不為空,判斷兩個原鏈表元素大小后,直接插入到新鏈表中

typedef struct ListNode ListNode;
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {//判斷為空鏈表if(list1==NULL){return list2;}if(list2==NULL){return list1;}ListNode* l1=list1;ListNode*l2=list2;//創建的新鏈表(鏈表不為空)ListNode*newHead,*newTail;//newHead=newTail=NULL;newHead=newTail=(ListNode*)malloc(sizeof(ListNode));while(l1&&l2){if(l1->val < l2->val){//l1拿下來尾插newTail->next=l1;newTail=newTail->next;l1=l1->next;}else{//l2拿下來尾插newTail->next=l2;newTail=newTail->next;l2=l2->next;}}//跳出循環,要么l1先為空,要么l2先為空if(l2){newTail->next=l2;}if(l1){newTail->next=l1;}//動態申請的空間要手動釋放掉ListNode* ret=newHead->next;free(newHead);newHead=NULL;return ret;
}

環形鏈表的約瑟夫問題

環形鏈表的約瑟夫問題——牛客網
在這里插入圖片描述
環形鏈表與我們平時見到的鏈表不同的是:他的尾節點的next指針指向頭節點,而不是NULL。

在這里插入圖片描述

typedef struct ListNode ListNode;//創建節點ListNode*buyNode(int x){ListNode*node=(ListNode*)malloc(sizeof(ListNode));if(node==NULL){exit(1);}node->val=x;node->next=NULL;return node;}ListNode*createCircle(int n){//先創建第一個節點ListNode*phead=buyNode(1);ListNode*ptail=phead;for(int i=2;i<=n;i++){ptail->next=buyNode(i);ptail=ptail->next;}//首位相連ptail->next=phead;return ptail;} 
int ysf(int n, int m ) {//第一步,根據n創建帶環鏈表ListNode*prev=createCircle(n);ListNode*pcur=prev->next;//第二步記數int count=1;while(pcur->next!=pcur){if(count==m){//銷毀pcur節點prev->next=pcur->next;free(pcur);pcur=prev->next;count=1;}else {prev=pcur;pcur=pcur->next;count++;}}//此時剩下的一個節點就是要返回的值return pcur->val;}

分割鏈表

分割鏈表——力扣
在這里插入圖片描述

第一種思路

雙指針法:
1.創建大,小兩個新鏈表。
2.將小于特定值的節點放到小鏈表中,將大于等于特定值的節點放到大鏈表中
3.小鏈表的尾節點和大鏈表的第一個有效節點首尾相連

在這里插入圖片描述
在這里插入圖片描述

typedef struct ListNode ListNode;
struct ListNode* partition(struct ListNode* head, int x){if(head==NULL){return head;}//創建兩個帶頭鏈表ListNode*lessHead,*lessTail;ListNode*greaterHead,*greaterTail;lessHead=lessTail=(ListNode*)malloc(sizeof(ListNode));greaterHead=greaterTail=(ListNode*)malloc(sizeof(ListNode));//遍歷原鏈表,將原鏈表中的節點尾插到大小鏈表中ListNode*pcur=head;while(pcur){if(pcur->val<x){//尾插到小鏈表中lessTail->next=pcur;lessTail=lessTail->next;}else{//尾插到大鏈表中greaterTail->next=pcur;greaterTail=greaterTail->next;}pcur=pcur->next;}//修改大鏈表的尾節點的next指針指向greaterTail->next=NULL;//小鏈表的尾節點和大鏈表的第一個有效節點首尾相連lessTail->next=greaterHead->next;ListNode*ret=lessHead->next;free(lessHead);free(greaterHead);lessHead=greaterHead=NULL;return ret;
}

第二種思路

HeadNode哨兵結點:用于頭插;Tail尾指針用于尾插;cur表示當前鏈表結點;
遍歷鏈表依次用鏈表結點元素值與X比較;小于則頭插;大于則尾插;
這里有一個小細節就是頭插時,如果尾指針等于哨兵HeadNode則需更新Tail指向尾結點

struct ListNode* partition(struct ListNode* head, int x){struct ListNode* HeadNode=(struct ListNode*)malloc(sizeof(struct ListNode));struct ListNode* Tail=HeadNode,*cur=head;Tail->next=NULL;while(cur){struct ListNode* next=cur->next;if(cur->val<x){cur->next=HeadNode->next;HeadNode->next=cur;if(Tail==HeadNode){Tail=cur;}}else{Tail->next=cur;Tail=cur;cur->next=NULL;}cur=next;}return HeadNode->next;
}

完結

好了,這期的分享到這里就結束了~
如果這篇博客對你有幫助的話,可以點一個免費的贊并收藏起來喲~
可以點點關注,避免找不到我~
我們下期不見不散~~
這個鏈表題目還會繼續,敬請期待~

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

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

相關文章

chatgpt之api的調用問題

1.調用api過程中&#xff0c;出現如下報錯內容 先寫一個測試樣例 import openaiopenai.api_key "OPEN_AI_KEY" openai.api_base"OPEN_AI_BASE_URL" # 是否需要base根據自己所在地區和key情況進行completion openai.ChatCompletion.create(model"g…

【intro】GNN中異構圖(heterogeneous graph)綜述

本篇博客內容是讀兩篇論文&#xff0c;兩篇論文連接如下&#xff1a; Heterogeneous graph neural networks analysis: a survey of techniques, evaluations and applications A Survey on Heterogeneous Graph Embedding: Methods, Techniques, Applications and Sources …

瓦羅蘭特國際服 外服游玩教程 瓦羅蘭特外服下載注冊游玩指南

瓦羅蘭特國際服 外服游玩教程 瓦羅蘭特外服下載注冊游玩指南 瓦羅蘭特作為當今游戲圈頂流的一款熱門FPS。游戲&#xff0c;作為拳頭游戲公司劃時代的一款游戲。游戲不僅延續了傳統FPS游戲的玩法&#xff0c;還添加許多新玩法&#xff0c;這也是游戲可以吸引大批量玩家的原因之…

Flink面試整理-對Flink的高級特性如CEP(復雜事件處理)、狀態后端選擇和調優等有所了解

Apache Flink 提供了一系列高級特性,使其成為一個強大的實時數據處理框架,特別適用于復雜的數據處理場景。其中,復雜事件處理(CEP)、狀態后端的選擇和調優是其中重要的幾個方面。 復雜事件處理(CEP) CEP 概念:CEP 是用于在數據流中識別復雜模式的技術。它允許用戶指定事…

基于電導增量MPPT控制算法的光伏發電系統simulink建模與仿真

目錄 1.課題概述 2.系統仿真結果 3.核心程序與模型 4.系統原理簡介 5.完整工程文件 1.課題概述 基于電導增量MPPT控制算法的光伏發電系統simulink建模與仿真。輸出MPPT跟蹤后的系統電流&#xff0c;電壓以及功率。 2.系統仿真結果 3.核心程序與模型 版本&#xff1a;MAT…

cocos creator 3.x實現手機虛擬操作桿

簡介 在許多移動游戲中&#xff0c;虛擬操縱桿是一個重要的用戶界面元素&#xff0c;用于控制角色或物體的移動。本文將介紹如何在Unity中實現虛擬操縱桿&#xff0c;提供了一段用于移動控制的代碼。我們將討論不同類型的虛擬操縱桿&#xff0c;如固定和跟隨&#xff0c;以及如…

Go常見語法題目解析

1、寫出下面代碼輸出內容。 package mainimport ("fmt" )func main() {defer_call() }func defer_call() {defer func() { fmt.Println("打印前") }()defer func() { fmt.Println("打印中") }()defer func() { fmt.Println("打印后")…

快速冪

a^b % q 給定整數 a b q&#xff0c; 求 a 的 b 次方 mod q 根據題目數字取值范圍&#xff0c;不能暴力處理。 會有兩個問題&#xff1a; 1、計算 a 的次方會超出范圍 2、不能循環 b 次計算 a 的乘積&#xff0c;會超時 處理問題1&#xff1a; 每計算一次 a 的乘積&#xf…

視頻匯聚平臺EasyCVR對接GA/T 1400視圖庫結構化數據:人員/人臉、非/機動車、物品

在信息化浪潮席卷全球的背景下&#xff0c;公安信息化建設日益成為提升社會治理能力和維護社會穩定的關鍵手段。其中&#xff0c;GA/T 1400標準作為公安視頻圖像信息應用系統的核心規范&#xff0c;以其結構化數據處理與應用能力&#xff0c;為公安信息化建設注入了強大的動力。…

【圖解IO與Netty系列】Reactor模型

Reactor模型 Reactor模型簡介三類事件與三類角色Reactor模型整體流程 各種Reactor模型單Reactor單線程模型單Reactor多線程模型主從Reactor模型 Reactor模型簡介 Reactor模型是服務器端用于處理高并發網絡IO請求的編程模型&#xff0c;與傳統的一請求一線程的同步式編程模型不…

翼龍面板是什么,如何進行搭建

翼龍面板是一個開源的&#xff0c;用于游戲服務器管理的程序&#xff0c;可以方便地在網頁界面中創建Minecraft&#xff0c;起源引擎游戲和Teamspeak3 服務器。 它使用前后端程序&#xff0c;因此可以創建多后端節點&#xff0c;對游戲服務器和服務器節點進行統一管理。 對游戲…

Vue進階之Vue無代碼可視化項目(二)

Vue無代碼可視化項目 項目初始化路由子路由錯誤示范正確示范App.vuerouter/index.tsAboutView.vueAboutAboutview.vuerouter/index.ts項目路由router/index.tsApp.vueActionsView.vueDataSourceView.vueLayoutView.vue路由樣式App.vue進一步的App.vue項目初始化 路由 router i…

synchronized 鎖的到底是什么?

通過8種情況演示鎖運行案例&#xff0c;看看我們到底鎖的是什么 1鎖相關的8種案例演示code package com.bilibili.juc.lock;import java.util.concurrent.TimeUnit;/*** 題目&#xff1a;談談你對多線程鎖的理解&#xff0c;8鎖案例說明* 口訣&#xff1a;線程 操作 資源類* 8…

修改hostname導致RabbitMQ數據丟失

背景介紹 公司的很多關鍵服務都使用了RabbitMQ來作為消息隊列服務, 可以說是非常地關鍵的一個環節, 最近由于業務量的上升, 導致RabbitMQ的CPU持續走高, 所以抽空研究了一下RabbitMQ的擴容, 利用我們自己運維平臺使用的一個單節點的RabbitMQ來作為測試吧.看到這個單節點的Rabbi…

第十七節 huggingface的trainner的斷點續訓的Demo(resume)

文章目錄 前言一、參數決定權重保存1、model.safetensors保存2、scaler.pt保存3、optimizer.pt與scheduler.pt保存4、self.state狀態保存(trainer_state.json)5、rng_state.pth保存6、權重相關保存位置(huggingface)二、Resume的Demo1、Demo構建2、實現Resume方法三、Resume訓…

005 CentOS 7.9 RabbitMQ安裝及配置

https://github.com/rabbitmq/rabbitmq-server/releases https://www.rabbitmq.com/docs/download https://packagecloud.io/rabbitmq/rabbitmq-server https://www.erlang-solutions.com/downloads/ https://www.erlang.org/ 文章目錄 卸載erlerl版本安裝與下載版本不匹配正…

AI技術的深度探索:重塑未來的智能引擎

隨著科技的迅猛進步&#xff0c;人工智能&#xff08;AI&#xff09;技術已經逐漸滲透到我們生活的每一個角落&#xff0c;從簡單的智能助手到復雜的決策支持系統&#xff0c;AI技術以其獨特的方式和前所未有的速度改變著我們的世界。本文將對AI技術進行深入探討&#xff0c;從…

開源貢獻 | 基于長安鏈去中心化數字身份合約標準協議(CMDID-1)的DID

DID為每個實體&#xff08;人、組織、物品等&#xff09;提供了一個唯一的全球身份標識符&#xff0c;讓用戶可以控制和管理的自己的數字身份&#xff0c;并在使用時以最小化的方式出示&#xff0c;將數據所有權歸還用戶的同時以區塊鏈技術保證了身份的不可篡改性&#xff0c;以…

LeetCode875愛吃香蕉的阿珂

題目描述 珂珂喜歡吃香蕉。這里有 n 堆香蕉&#xff0c;第 i 堆中有 piles[i] 根香蕉。警衛已經離開了&#xff0c;將在 h 小時后回來。珂珂可以決定她吃香蕉的速度 k &#xff08;單位&#xff1a;根/小時&#xff09;。每個小時&#xff0c;她將會選擇一堆香蕉&#xff0c;從…

IntelliJ IDEA / Android Studio 方法顯示Git提交人

顯示方法&#xff1a; 設置 > 編輯器 > 嵌入提示 > Code Vision > 代碼作者&#xff08;勾選&#xff09; IntelliJ IDEA Android Studio