TypeScript合并兩個排序鏈表的方法詳解
前言
給定兩個遞增排序的鏈表,如何將這兩個鏈表合并?合并后的鏈表依然按照遞增排序。本文就跟大家分享一種解決方案
思路分析
經(jīng)過前面的學習,我們知道了有關(guān)鏈表的操作可以用指針來完成。同樣的,這個問題也可以用雙指針的思路來實現(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. 遞歸比對指針指向的兩個值,構(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合并兩個排序鏈表的方法詳解的文章就介紹到這了,更多相關(guān)TypeScript合并排序鏈表內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于javascript event flow 的一個bug詳解
描述了firefox,safari 有一個bug和DOM 3 規(guī)范不一致:在event.currentTarget等于event.target的時候(即event flow處于target phase時),會調(diào)用添加到currentTarget上的useCapture為true的listener2013-09-09
JavaScript實現(xiàn)簡單的文本逐字打印效果示例
這篇文章主要介紹了JavaScript實現(xiàn)簡單的文本逐字打印效果,涉及javascript結(jié)合時間函數(shù)動態(tài)操作頁面元素相關(guān)實現(xiàn)技巧,需要的朋友可以參考下2018-04-04
js中offset,client , scroll 三大元素知識點總結(jié)
在本篇文章里小編給大家整理了關(guān)于js 元素offset,client , scroll 三大系列總結(jié),有需要的朋友們可以學習下。2019-09-09

