亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

js合并有序鏈表

jollywing / 1923人閱讀

摘要:關(guān)于鏈表區(qū)別于數(shù)組,數(shù)組的所有的元素在內(nèi)存中都是連續(xù)存儲(chǔ)的,而鏈表則是分散在內(nèi)存中的,通過(guò)指針連接起來(lái)的一種數(shù)據(jù)結(jié)構(gòu)。接下來(lái),我們嘗試使用合并兩個(gè)有序鏈表。

關(guān)于鏈表

區(qū)別于數(shù)組,數(shù)組的所有的元素在內(nèi)存中都是連續(xù)存儲(chǔ)的,而鏈表則是分散在內(nèi)存中的,通過(guò)指針連接起來(lái)的一種數(shù)據(jù)結(jié)構(gòu)。接下來(lái),我們嘗試使用js合并兩個(gè)有序鏈表。

一些準(zhǔn)備

首先我們需要聲明一些我們需要用到的函數(shù)。

鏈表中的節(jié)點(diǎn)

每一個(gè)節(jié)點(diǎn)通常最少有兩個(gè)屬性,一個(gè)表示該節(jié)點(diǎn)的值,可以用key來(lái)表示,另外一個(gè)就是指向下一個(gè)節(jié)點(diǎn)的指針,可以用next表示。
先聲明一個(gè)Node類:

function Node (key) {
    this.key = key;
    this.next = null;
}
鏈表類

接著,聲明一個(gè)鏈表類LinkedList:

function LinkedList () {
    //表示鏈表的長(zhǎng)度
    this.length = 0;
    //表示鏈表的頭結(jié)點(diǎn)(第一個(gè)節(jié)點(diǎn))
    this.head = null;
}
鏈表的插入節(jié)點(diǎn)方法

然后,再聲明一個(gè)基本的鏈表方法append,用來(lái)向鏈表尾部插入一個(gè)新節(jié)點(diǎn):

LinkedList.prototype.append = function (key){
    var node = new Node(key);
    //如果鏈表還沒(méi)有節(jié)點(diǎn)
    if (!this.head) {
        this.head = node;
    } else {
        //通過(guò)循環(huán)找到最后一個(gè)節(jié)點(diǎn),然后讓最后一個(gè)節(jié)點(diǎn)指向新節(jié)點(diǎn)
        var current = this.head;
        while(current.next){
            current = current.next;
        }
        current.next = node;
    }
    // 修改鏈表的長(zhǎng)度
    this.length++;
}
構(gòu)造兩個(gè)有序鏈表

我們的目的是合并有序鏈表,所以這里,我們先用兩個(gè)有序數(shù)組,去構(gòu)建兩個(gè)有序鏈表:

var arr1 = [2, 4, 6, 8];
var arr2 = [1, 3, 5, 7];
var list1 = new LinkedList();
var list2 = new LinkedList();

arr1.forEach(function(key){
    list1.append(key);
});
arr2.forEach(function(key){
    list2.append(key);
});
合并有序鏈表 最簡(jiǎn)單的方案

就是把兩個(gè)鏈表中所有key都拿出來(lái)放進(jìn)一個(gè)數(shù)組里,庵后,再對(duì)數(shù)組排序,根據(jù)數(shù)組,重新構(gòu)建一個(gè)鏈表。

function mergeLinkedList (list1, list2) {
    // 存放兩個(gè)鏈表key的數(shù)組
    var array = [];
    // 最終需要返回的新鏈表
    var list = new LinkedList();
    // 第一個(gè)鏈表的頭節(jié)點(diǎn)
    var listHead1 = list1.head;
    // 第二個(gè)鏈表的頭節(jié)點(diǎn)
    var listHead2 = list2.head;

    // 把第一個(gè)鏈表的所有key存進(jìn)數(shù)組
    while (listHead1) {
        array.push(listHead1.key);
        listHead1 = listHead1.next;
    }
    // 把第二個(gè)鏈表的所有key存進(jìn)數(shù)組
    while (listHead2) {
        array.push(listHead2.key);
        listHead2 = listHead2.next;
    }
    // 對(duì)數(shù)組排序
    array = array.sort(function(a, b){
        return a - b;
    })
    // 使用數(shù)組重新構(gòu)建一個(gè)鏈表
    array.forEach(function(key){
        list.append(key);
    });

    return list;
}
按順序把兩個(gè)鏈表的key插入到新鏈表
function mergeLinkedList (list1, list2) {
    var list = new LinkedList();
    // 第一個(gè)鏈表的頭節(jié)點(diǎn)
    var current1 = list1.head;
    // 第二個(gè)鏈表的頭節(jié)點(diǎn)
    var current2 = list2.head;

    // 用循環(huán)把兩個(gè)鏈表的key按順序插入到新鏈表
    while (current1 && current2) {
        if (current1.key < current2.key) {
            list.append(current1.key);
            current1 = current1.next;
        } else {
            list.append(current2.key);
            current2 = current2.next;
        }
    }

    // 找到新鏈表的最后一個(gè)節(jié)點(diǎn)
    var current = list.head;
    while(current.next){
        current = current.next;
    }

    // 循環(huán)完成以后,把第二個(gè)鏈表剩余部分插入到新鏈表
    if (current2) {
        while (current2) {
            list.append(current2.key);
            current2 = current2.next;
        }
    }
    // 循環(huán)完成以后,把第一個(gè)鏈表剩余部分插入到新鏈表
    if (current1) {
        while (current1) {
            list.append(current1.key);
            current1 = current1.next;
        }
    }

    return list;
}
合并到第一個(gè)鏈表
function mergeLinkedList (list1, list2) {
    var listHead1 = list1.head;
    var listHead2 = list2.head;
    var previous = listHead1;

    // 如果第二個(gè)鏈表的首節(jié)點(diǎn)key小于第一個(gè)鏈表的首節(jié)點(diǎn)key
    // 則構(gòu)造一個(gè)新節(jié)點(diǎn),并把新節(jié)點(diǎn)插入到第一個(gè)鏈表頭部
    if (listHead1.key > listHead2.key) {
        var node = new Node(listHead2.key);
        node.next = listHead1;
        list1.head = listHead1 = previous = node;
        listHead2 = listHead2.next;
    }
    // 循環(huán)比較兩個(gè)鏈表的key,把第二個(gè)鏈表中的key插入到第一個(gè)鏈表合適的位置
    while (listHead1 && listHead2) {
        if (listHead2.key < listHead1.key) {
            var node = new Node(listHead2.key);
            node.next = previous.next;
            previous.next = node;
            previous = node;
            listHead2 = listHead2.next;
        } else {
            previous = listHead1;
            listHead1 = listHead1.next; 
        }
    }
    // 如果第二個(gè)鏈表比較長(zhǎng),則把剩余部分插入到第一個(gè)鏈表
    while (listHead2) {
        var node = new Node(listHead2.key);
        if (listHead1) {
            listHead1.next = node;
            listHead1 = node;                    
        } else if (previous) {
            previous.next = node;
            previous = node;    
        }

        listHead2 = listHead2.next;
    }

    // 修正第一個(gè)鏈表的長(zhǎng)度
    list1.length = list1.length + list2.length;
    return list1;
}
結(jié)果驗(yàn)證

還是構(gòu)造兩個(gè)有序鏈表

var arr1 = [2, 4, 6, 8];
var arr2 = [1, 3, 5, 7];
var list1 = new LinkedList();
var list2 = new LinkedList();
arr1.forEach(function(key){
    list1.append(key);
});
arr2.forEach(function(key){
    list2.append(key);
});
var list = mergeLinkedList(list1, list2);

自控制臺(tái)查看結(jié)果:

換一組測(cè)試數(shù)據(jù)(arr1和arr2調(diào)換一下):

var arr2 = [2, 4, 6, 8];
var arr1 = [1, 3, 5, 7];
var list1 = new LinkedList();
var list2 = new LinkedList();
arr1.forEach(function(key){
    list1.append(key);
});
arr2.forEach(function(key){
    list2.append(key);
});
var list = mergeLinkedList(list1, list2);

看結(jié)果:

來(lái)一個(gè)復(fù)雜點(diǎn)的測(cè)試數(shù)據(jù):

var arr1 = [99, 100, 104, 106];
var arr2 = [1, 3, 5, 7, 102, 103, 107];
var list1 = new LinkedList();
var list2 = new LinkedList();
arr1.forEach(function(key){
    list1.append(key);
});
arr2.forEach(function(key){
    list2.append(key);
});
var list = mergeLinkedList(list1, list2);

結(jié)果如下:

以上代碼中,都省去了參數(shù)合法性校驗(yàn)的過(guò)程,真實(shí)環(huán)境里是需要的。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/89206.html

相關(guān)文章

  • LeetCode 21:合并兩個(gè)有序鏈表 Merge Two Sorted Lists

    摘要:將兩個(gè)有序鏈表合并為一個(gè)新的有序鏈表并返回。新鏈表是通過(guò)拼接給定的兩個(gè)鏈表的所有節(jié)點(diǎn)組成的。無(wú)非是依次將兩個(gè)鏈表每個(gè)節(jié)點(diǎn)的值對(duì)比,取出值較小的節(jié)點(diǎn),添加到新鏈表末尾。將剩余鏈表傳回遞歸函數(shù)。 將兩個(gè)有序鏈表合并為一個(gè)新的有序鏈表并返回。新鏈表是通過(guò)拼接給定的兩個(gè)鏈表的所有節(jié)點(diǎn)組成的。 Merge two sorted linked lists and return it as a n...

    LeviDing 評(píng)論0 收藏0
  • LeetCode 之 JavaScript 解答第23題 —— 合并K個(gè)有序鏈表(Merge K S

    摘要:分治算法遞歸每層操作分解將原問(wèn)題分解成一系列的子問(wèn)題。分治算法滿足的條件可分解原問(wèn)題與分解成的小問(wèn)題具有相同的模式無(wú)關(guān)聯(lián)原問(wèn)題分解成的子問(wèn)題可以獨(dú)立求解,子問(wèn)題之間沒(méi)有相關(guān)性,這一點(diǎn)是分治算法跟動(dòng)態(tài)規(guī)劃的明顯區(qū)別。 Time:2019/4/10Title: Merge K Sorted ListsDifficulty: DifficultyAuthor: 小鹿 題目:Merge K...

    zhou_you 評(píng)論0 收藏0
  • LeetCode21.合并兩個(gè)有序鏈表 JavaScript

    摘要:將兩個(gè)有序鏈表合并為一個(gè)新的有序鏈表并返回。新鏈表是通過(guò)拼接給定的兩個(gè)鏈表的所有節(jié)點(diǎn)組成的。示例輸入輸出答案參考 將兩個(gè)有序鏈表合并為一個(gè)新的有序鏈表并返回。新鏈表是通過(guò)拼接給定的兩個(gè)鏈表的所有節(jié)點(diǎn)組成的。 示例: 輸入:1->2->4, 1->3->4輸出:1->1->2->3->4->4 答案參考: /** * Definition for singly-linked list...

    A Loity 評(píng)論0 收藏0
  • LeetCode 之 JavaScript 解答第21題 —— 合并兩個(gè)有序鏈表(Merge Two

    摘要:什么意思呢比如上方合并鏈表的代碼,分別明確函數(shù)的參數(shù)和返回值是什么參數(shù)是兩個(gè)合并的鏈表結(jié)點(diǎn)頭結(jié)點(diǎn)。返回值是合并后的鏈表。 Time:2019/4/9Title: Merge Two Sorted ListsDifficulty: EasyAuthor: 小鹿 題目:Merge Two Sorted Lists Merge two sorted linked lists and re...

    wdzgege 評(píng)論0 收藏0
  • <LeetCode天梯>Day027 合并兩個(gè)有序鏈表(遞歸法+改進(jìn)遞歸) | 初級(jí)算法 | Pyt

    摘要:示例輸入輸出示例輸入輸出示例輸入輸出提示兩個(gè)鏈表的節(jié)點(diǎn)數(shù)目范圍是和均按非遞減順序排列遞歸法分析遞歸法,和之前的一樣,還是需要先設(shè)置跳出判斷,這里設(shè)置為空的時(shí)候跳出。 ...

    zhonghanwen 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<