日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
聊一聊合并兩個排序的鏈表

前言

思路分析

經(jīng)過前面的學習,我們知道了有關鏈表的操作可以用指針來完成。同樣的,這個問題也可以用雙指針的思路來實現(xiàn):

創(chuàng)新互聯(lián)是一家專業(yè)提供高明企業(yè)網(wǎng)站建設,專注與網(wǎng)站設計、做網(wǎng)站、html5、小程序制作等業(yè)務。10年已為高明眾多企業(yè)、政府機構(gòu)等服務。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站制作公司優(yōu)惠進行中。

  • 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)想到代碼怎么寫了。沒錯,這就是典型的遞歸思路,代碼如下:

  • 聲明一個函數(shù)MergeLinkedList,它接受2個參數(shù):遞增排序的鏈表1,遞增排序的鏈表2。
  • 遞歸的基線條件:鏈表1為null就返回鏈表2,鏈表2為null就返回鏈表1。
  • 聲明一個變量pMergedHead用于存儲合并后的鏈表頭節(jié)點。
  • 如果當前鏈表1的節(jié)點值小于鏈表2的節(jié)點值。

pMergedHead的值就為鏈表2的節(jié)點值。

pMergedHead的下一個節(jié)點值就為鏈表1的下一個節(jié)點和鏈表2的節(jié)點值比對后的值(遞歸)。

  • 否則

pMergedHead的值就為鏈表1的節(jié)點值。

pMergedHead的下一個節(jié)點值就為鏈表2的下一個節(jié)點和鏈表1的節(jié)點值比對后的值(遞歸)。

  • 最后,返回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
  • MergeLinkedList-test.ts

本文標題:聊一聊合并兩個排序的鏈表
分享地址:http://m.5511xx.com/article/djcecsj.html