TypeScript合并兩個(gè)排序鏈表的方法詳解
前言
給定兩個(gè)遞增排序的鏈表,如何將這兩個(gè)鏈表合并?合并后的鏈表依然按照遞增排序。本文就跟大家分享一種解決方案
思路分析
經(jīng)過前面的學(xué)習(xí),我們知道了有關(guān)鏈表的操作可以用指針來完成。同樣的,這個(gè)問題也可以用雙指針的思路來實(shí)現(xiàn):
- p1指針指向鏈表1的頭節(jié)點(diǎn)
- p2指針指向鏈表2的頭節(jié)點(diǎn)
聲明一個(gè)變量存儲(chǔ)合并后的鏈表,比對兩個(gè)指針指向的節(jié)點(diǎn)值大小:
- 如果p1指針指向的節(jié)點(diǎn)值比p2指向的值小,合并后的鏈表節(jié)點(diǎn)就取p1節(jié)點(diǎn)的值,p1指針繼續(xù)向前走,進(jìn)行下一輪的比對
- 如果p2指針指向的節(jié)點(diǎn)值比p1指向的值小,合并后的鏈表節(jié)點(diǎn)就取p2節(jié)點(diǎn)的值,p2指針繼續(xù)向前走,進(jìn)行下一輪的比對
- 當(dāng)p1節(jié)點(diǎn)指向null時(shí),合并后的鏈表節(jié)點(diǎn)就為p2所指向的鏈表節(jié)點(diǎn);當(dāng)p2節(jié)點(diǎn)指向null時(shí),合并后的鏈表節(jié)點(diǎn)就為p1所指向的鏈表節(jié)點(diǎn)。
實(shí)現(xiàn)代碼
看完上述分析后,聰明的開發(fā)者已經(jīng)想到代碼怎么寫了。沒錯(cuò),這就是典型的遞歸思路,代碼如下:
1.聲明一個(gè)函數(shù)MergeLinkedList,它接受2個(gè)參數(shù):遞增排序的鏈表1,遞增排序的鏈表2
2.遞歸的基線條件:鏈表1為null就返回鏈表2,鏈表2為null就返回鏈表1
3.聲明一個(gè)變量pMergedHead
用于存儲(chǔ)合并后的鏈表頭節(jié)點(diǎn)
4.如果當(dāng)前鏈表1的節(jié)點(diǎn)值小于鏈表2的節(jié)點(diǎn)值
- pMergedHead的值就為鏈表2的節(jié)點(diǎn)值
- pMergedHead的下一個(gè)節(jié)點(diǎn)值就為鏈表1的下一個(gè)節(jié)點(diǎn)和鏈表2的節(jié)點(diǎn)值比對后的值(遞歸)
5.否則
- pMergedHead的值就為鏈表1的節(jié)點(diǎn)值
- pMergedHead的下一個(gè)節(jié)點(diǎn)值就為鏈表2的下一個(gè)節(jié)點(diǎn)和鏈表1的節(jié)點(diǎn)值比對后的值(遞歸)
6.最后,返回pMergedHead
export function MergeLinkedList( firstListHead: ListNode | null, secondListHead: ListNode | null ): ListNode | null { // 基線條件 if (firstListHead == null) { return secondListHead; } if (secondListHead == null) { return firstListHead; } let pMergedHead: ListNode | null = null; if (firstListHead.element < secondListHead.element) { pMergedHead = firstListHead; pMergedHead.next = MergeLinkedList(firstListHead.next, secondListHead); } else { pMergedHead = secondListHead; pMergedHead.next = MergeLinkedList(firstListHead, secondListHead.next); } return pMergedHead; }
測試用例
接下來,我們用思路分析章節(jié)中的例子來測試下我們的代碼能否正常執(zhí)行。
const firstLinkedList = new LinkedList(); firstLinkedList.push(1); firstLinkedList.push(3); firstLinkedList.push(5); firstLinkedList.push(7); firstLinkedList.push(9); const secondLinkedList = new LinkedList(); secondLinkedList.push(2); secondLinkedList.push(4); secondLinkedList.push(6); secondLinkedList.push(8); const resultListHead = MergeLinkedList( firstLinkedList.getHead(), secondLinkedList.getHead() ); console.log(resultListHead);
示例代碼
本文所列舉的代碼如下
MergeLinkedList.ts
import { ListNode } from "./utils/linked-list-models.ts"; /** * 合并兩個(gè)排序的鏈表 * 1. p1指針指向鏈表1,p2指針指向鏈表2 * 2. 遞歸比對指針指向的兩個(gè)值,構(gòu)造新的鏈表 * @param firstListHead 鏈表1 * @param secondListHead 鏈表2 * @constructor */ export function MergeLinkedList( firstListHead: ListNode | null, secondListHead: ListNode | null ): ListNode | null { // 基線條件 if (firstListHead == null) { return secondListHead; } if (secondListHead == null) { return firstListHead; } let pMergedHead: ListNode | null = null; if (firstListHead.element < secondListHead.element) { pMergedHead = firstListHead; pMergedHead.next = MergeLinkedList(firstListHead.next, secondListHead); } else { pMergedHead = secondListHead; pMergedHead.next = MergeLinkedList(firstListHead, secondListHead.next); } return pMergedHead; }
MergeLinkedList-test.ts
import { MergeLinkedList } from "../MergeLinkedList.ts"; import LinkedList from "../lib/LinkedList.ts"; const firstLinkedList = new LinkedList(); firstLinkedList.push(1); firstLinkedList.push(3); firstLinkedList.push(5); firstLinkedList.push(7); firstLinkedList.push(9); const secondLinkedList = new LinkedList(); secondLinkedList.push(2); secondLinkedList.push(4); secondLinkedList.push(6); secondLinkedList.push(8); const resultListHead = MergeLinkedList( firstLinkedList.getHead(), secondLinkedList.getHead() ); console.log(resultListHead);
到此這篇關(guān)于TypeScript合并兩個(gè)排序鏈表的方法詳解的文章就介紹到這了,更多相關(guān)TypeScript合并排序鏈表內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
js實(shí)現(xiàn)發(fā)送驗(yàn)證碼后的倒計(jì)時(shí)功能
本文解決方案的基本思路是點(diǎn)擊就將按鈕設(shè)為disabled,然后根據(jù)cookie判斷是否設(shè)置過期時(shí)間,將手機(jī)利用ajax提交到后臺的發(fā)短信接口,就可以了2015-05-05JS拖拽排序插件Sortable.js用法實(shí)例分析
這篇文章主要介紹了JS拖拽排序插件Sortable.js用法,結(jié)合實(shí)例形式分析了拖拽排序插件Sortable.js功能、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-02-02JS實(shí)現(xiàn)對中文字符串進(jìn)行utf-8的Base64編碼的方法(使其與Java編碼相同)
這篇文章主要介紹了JS實(shí)現(xiàn)對中文字符串進(jìn)行utf-8的Base64編碼的方法,對比java的base64編碼程序,分析了javascript實(shí)現(xiàn)base64編碼的相關(guān)技巧,需要的朋友可以參考下2016-06-06小程序云開發(fā)實(shí)現(xiàn)數(shù)據(jù)庫異步操作同步化
這篇文章主要為大家詳細(xì)介紹了小程序云開發(fā)實(shí)現(xiàn)數(shù)據(jù)庫異步操作同步化,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05原生JavaScript實(shí)現(xiàn)日歷功能代碼實(shí)例(無引用Jq)
這篇文章主要介紹了原生JavaScript實(shí)現(xiàn)日歷功能代碼實(shí)例(無引用Jq),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09利用CSS、JavaScript及Ajax實(shí)現(xiàn)高效的圖片預(yù)加載
圖片預(yù)加載想必大家都不陌生吧,實(shí)現(xiàn)預(yù)加載圖片有很多方法,包括使用CSS、JavaScript及兩者的各種組合。這些技術(shù)可根據(jù)不同設(shè)計(jì)場景設(shè)計(jì)出相應(yīng)的解決方案,十分高效2013-10-10