欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

TypeScript合并兩個(gè)排序鏈表的方法詳解

 更新時(shí)間:2022年06月27日 09:06:37   作者:神奇的程序員  
給定兩個(gè)遞增排序的鏈表,如何將這兩個(gè)鏈表合并?合并后的鏈表依然按照遞增排序。本文就跟大家如何利用TypeScript實(shí)現(xiàn)這一效果,感興趣的可以學(xué)習(xí)一下

前言

給定兩個(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)。

image-20220627070633451

實(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);

image-20220627072844184

示例代碼

本文所列舉的代碼如下

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)文章

最新評論