摘要:需求實(shí)現(xiàn)函數(shù)進(jìn)行歸并排序。解法歸并排序的運(yùn)行方式是,遞歸的把一個(gè)大鏈表切分成兩個(gè)小鏈表。切分到最后就全是單節(jié)點(diǎn)鏈表了,而單節(jié)點(diǎn)鏈表可以被認(rèn)為是已經(jīng)排好序的。這時(shí)候再兩兩合并,最終會(huì)得到一個(gè)完整的已排序鏈表。用把排好序的兩個(gè)鏈表合并起來(lái)。
TL;DR
對(duì)鏈表進(jìn)行歸并排序,系列目錄見 前言和目錄 。
需求實(shí)現(xiàn)函數(shù) mergeSort() 進(jìn)行歸并排序。注意這種排序法需要使用遞歸。在 frontBackSplit() 和 sortedMerge() 兩個(gè)函數(shù)的幫助下,你可以很輕松的寫一個(gè)遞歸的排序。基本算法是,把一個(gè)鏈表切分成兩個(gè)更小的鏈表,遞歸地對(duì)它們進(jìn)行排序,最終把兩個(gè)排好序的小鏈表合成完整的鏈表。
var list = 4 -> 2 -> 1 -> 3 -> 8 -> 9 -> null mergeSort(list) === 1 -> 2 -> 3 -> 4 -> 8 -> 9 -> null解法
歸并排序的運(yùn)行方式是,遞歸的把一個(gè)大鏈表切分成兩個(gè)小鏈表。切分到最后就全是單節(jié)點(diǎn)鏈表了,而單節(jié)點(diǎn)鏈表可以被認(rèn)為是已經(jīng)排好序的。這時(shí)候再兩兩合并,最終會(huì)得到一個(gè)完整的已排序鏈表。
因?yàn)榍蟹趾秃喜蓚€(gè)最重要的功能都已經(jīng)實(shí)現(xiàn),需要思考的就只是如何遞歸整個(gè)過(guò)程了。我們分析一下可以把整個(gè)過(guò)程分成:
用 frontBackSplit() 把鏈表切分成兩個(gè),分別叫 first 和 second 。
對(duì) first 和 second 排序。
用 sortedMerge() 把排好序的兩個(gè)鏈表合并起來(lái)。
其中第 2 步就是遞歸的點(diǎn),因?yàn)榕判蜻@個(gè)事情恰好是 mergeSort 本身可以做的。
代碼如下:
const { Node } = require("./00-utils") const { frontBackSplit } = require("./12-front-back-split") const { sortedMerge } = require("./14-sorted-merge") function mergeSort(list) { if (!list || !list.next) return list const first = new Node() const second = new Node() frontBackSplit(list, first, second) return sortedMerge(mergeSort(first), mergeSort(second)) }參考資料
Codewars Kata
GitHub 的代碼實(shí)現(xiàn)
GitHub 的測(cè)試
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/81590.html
摘要:我打算寫一個(gè)鏈表操作的系列,來(lái)自的系列,實(shí)現(xiàn)語(yǔ)言是。通過(guò)自己實(shí)現(xiàn)一個(gè)鏈表和常用操作,可以加深理解這類數(shù)據(jù)結(jié)構(gòu)的優(yōu)缺點(diǎn)。鏈表經(jīng)常用來(lái)訓(xùn)練指針操作,雖然這只對(duì)適用,但等高級(jí)語(yǔ)言中控制引用的思路其實(shí)也差不多。 TL;DR 我打算寫一個(gè)鏈表操作的系列,來(lái)自 Codewars 的 Linked List 系列 kata ,實(shí)現(xiàn)語(yǔ)言是 JavaScript 。這篇是開篇,簡(jiǎn)單描述了一下我寫這個(gè)的目...
摘要:棧被稱為一種后入先出的數(shù)據(jù)結(jié)構(gòu)。散列使用的數(shù)據(jù)結(jié)構(gòu)叫做散列表。這些操作需要求助于其他數(shù)據(jù)結(jié)構(gòu),比如下面介紹的二叉查找樹。 前言 在過(guò)去的幾年中,得益于Node.js的興起,JavaScript越來(lái)越廣泛地用于服務(wù)器端編程。鑒于JavaScript語(yǔ)言已經(jīng)走出了瀏覽器,程序員發(fā)現(xiàn)他們需要更多傳統(tǒng)語(yǔ)言(比如C++和Java)提供的工具。這些工具包括傳統(tǒng)的數(shù)據(jù)結(jié)構(gòu)(如鏈表,棧,隊(duì)列,圖等),...
摘要:微信公眾號(hào)記錄截圖記錄截圖目前關(guān)于這塊算法與數(shù)據(jù)結(jié)構(gòu)的安排前。已攻略返回目錄目前已攻略篇文章。會(huì)根據(jù)題解以及留言內(nèi)容,進(jìn)行補(bǔ)充,并添加上提供題解的小伙伴的昵稱和地址。本許可協(xié)議授權(quán)之外的使用權(quán)限可以從處獲得。 Create by jsliang on 2019-07-15 11:54:45 Recently revised in 2019-07-15 15:25:25 一 目錄 不...
摘要:需求實(shí)現(xiàn)函數(shù)把兩個(gè)鏈表合并成一個(gè)。新鏈表的節(jié)點(diǎn)是交叉從兩個(gè)鏈表中取的。通過(guò)行的調(diào)換指針,我們可以保證下一次循環(huán)就是對(duì)另一個(gè)鏈表進(jìn)行操作了。這樣一直遍歷到兩個(gè)鏈表末尾,返回結(jié)束。參考資料的代碼實(shí)現(xiàn)的測(cè)試 TL;DR 把兩個(gè)鏈表洗牌合并成一個(gè),系列目錄見 前言和目錄 。 需求 實(shí)現(xiàn)函數(shù) shuffleMerge() 把兩個(gè)鏈表合并成一個(gè)。新鏈表的節(jié)點(diǎn)是交叉從兩個(gè)鏈表中取的。這叫洗牌合并。舉...
摘要:題目分析一看到問(wèn)題,而且時(shí)間復(fù)雜度要求又是,很自然地就會(huì)想到數(shù)組時(shí),如下這道題要求是,所以在上面的基礎(chǔ)上還要進(jìn)行一些額外操作找到的中點(diǎn),使用快慢指針?lè)āP枰⒁獾氖牵业街悬c(diǎn)后要把鏈表分成兩段,即兩個(gè)鏈表。這部分代碼應(yīng)該近似于這道題的答案。 Sort a linked list in O(n log n) time using constant space complexity. 題...
閱讀 2306·2021-11-23 10:09
閱讀 2885·2021-10-12 10:11
閱讀 2594·2021-09-29 09:35
閱讀 1337·2019-08-30 15:53
閱讀 2261·2019-08-30 11:15
閱讀 2904·2019-08-29 13:01
閱讀 2290·2019-08-28 18:15
閱讀 3363·2019-08-26 12:13