TypeScript合并兩個排序鏈表的方法詳解
前言
給定兩個遞增排序的鏈表,如何將這兩個鏈表合并?合并后的鏈表依然按照遞增排序。本文就跟大家分享一種解決方案
思路分析
經(jīng)過前面的學習,我們知道了有關鏈表的操作可以用指針來完成。同樣的,這個問題也可以用雙指針的思路來實現(xiàn):
- p1指針指向鏈表1的頭節(jié)點
- p2指針指向鏈表2的頭節(jié)點
聲明一個變量存儲合并后的鏈表,比對兩個指針指向的節(jié)點值大?。?/p>
- 如果p1指針指向的節(jié)點值比p2指向的值小,合并后的鏈表節(jié)點就取p1節(jié)點的值,p1指針繼續(xù)向前走,進行下一輪的比對
- 如果p2指針指向的節(jié)點值比p1指向的值小,合并后的鏈表節(jié)點就取p2節(jié)點的值,p2指針繼續(xù)向前走,進行下一輪的比對
- 當p1節(jié)點指向null時,合并后的鏈表節(jié)點就為p2所指向的鏈表節(jié)點;當p2節(jié)點指向null時,合并后的鏈表節(jié)點就為p1所指向的鏈表節(jié)點。
實現(xiàn)代碼
看完上述分析后,聰明的開發(fā)者已經(jīng)想到代碼怎么寫了。沒錯,這就是典型的遞歸思路,代碼如下:
1.聲明一個函數(shù)MergeLinkedList,它接受2個參數(shù):遞增排序的鏈表1,遞增排序的鏈表2
2.遞歸的基線條件:鏈表1為null就返回鏈表2,鏈表2為null就返回鏈表1
3.聲明一個變量pMergedHead
用于存儲合并后的鏈表頭節(jié)點
4.如果當前鏈表1的節(jié)點值小于鏈表2的節(jié)點值
- pMergedHead的值就為鏈表2的節(jié)點值
- pMergedHead的下一個節(jié)點值就為鏈表1的下一個節(jié)點和鏈表2的節(jié)點值比對后的值(遞歸)
5.否則
- pMergedHead的值就為鏈表1的節(jié)點值
- pMergedHead的下一個節(jié)點值就為鏈表2的下一個節(jié)點和鏈表1的節(jié)點值比對后的值(遞歸)
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"; /** * 合并兩個排序的鏈表 * 1. p1指針指向鏈表1,p2指針指向鏈表2 * 2. 遞歸比對指針指向的兩個值,構造新的鏈表 * @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);
到此這篇關于TypeScript合并兩個排序鏈表的方法詳解的文章就介紹到這了,更多相關TypeScript合并排序鏈表內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
JS實現(xiàn)對中文字符串進行utf-8的Base64編碼的方法(使其與Java編碼相同)
這篇文章主要介紹了JS實現(xiàn)對中文字符串進行utf-8的Base64編碼的方法,對比java的base64編碼程序,分析了javascript實現(xiàn)base64編碼的相關技巧,需要的朋友可以參考下2016-06-06小程序云開發(fā)實現(xiàn)數(shù)據(jù)庫異步操作同步化
這篇文章主要為大家詳細介紹了小程序云開發(fā)實現(xiàn)數(shù)據(jù)庫異步操作同步化,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-05-05原生JavaScript實現(xiàn)日歷功能代碼實例(無引用Jq)
這篇文章主要介紹了原生JavaScript實現(xiàn)日歷功能代碼實例(無引用Jq),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-09-09利用CSS、JavaScript及Ajax實現(xiàn)高效的圖片預加載
圖片預加載想必大家都不陌生吧,實現(xiàn)預加載圖片有很多方法,包括使用CSS、JavaScript及兩者的各種組合。這些技術可根據(jù)不同設計場景設計出相應的解決方案,十分高效2013-10-10