国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

面試算法78:合并排序鏈表

這篇具有很好參考價值的文章主要介紹了面試算法78:合并排序鏈表。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

題目

輸入k個排序的鏈表,請將它們合并成一個排序的鏈表。
面試算法78:合并排序鏈表,算法,面試,算法,鏈表

分析:利用最小堆選取值最小的節(jié)點

用k個指針分別指向這k個鏈表的頭節(jié)點,每次從這k個節(jié)點中選取值最小的節(jié)點。然后將指向值最小的節(jié)點的指針向后移動一步,再比較k個指針指向的節(jié)點并選取值最小的節(jié)點。重復(fù)這個過程,直到所有節(jié)點都被選取出來。

public class Test {
    public static void main(String[] args) {
        ListNode listNode1 = new ListNode(1);
        ListNode listNode2 = new ListNode(2);
        ListNode listNode3 = new ListNode(3);
        ListNode listNode4 = new ListNode(4);
        ListNode listNode5 = new ListNode(5);
        ListNode listNode6 = new ListNode(6);
        ListNode listNode7 = new ListNode(7);
        ListNode listNode8 = new ListNode(8);
        ListNode listNode9 = new ListNode(9);

        listNode1.next = listNode4;
        listNode4.next = listNode7;

        listNode2.next = listNode5;
        listNode5.next = listNode8;

        listNode3.next = listNode6;
        listNode6.next = listNode9;

        ListNode[] lists = {listNode1, listNode2, listNode3};
        ListNode result = mergeKLists(lists);
        while (result != null) {
            System.out.println(result.val);
            result = result.next;
        }
    }

    public static ListNode mergeKLists(ListNode[] lists) {
        ListNode dummy = new ListNode(0);
        ListNode cur = dummy;

        PriorityQueue<ListNode> minHeap = new PriorityQueue<>((n1, n2) -> n1.val - n2.val);
        for (ListNode list : lists) {
            if (list != null) {
                minHeap.offer(list);
            }
        }

        while (!minHeap.isEmpty()) {
            ListNode least = minHeap.poll();
            cur.next = least;
            cur = least;

            if (least.next != null) {
                minHeap.offer(least.next);
            }
        }

        return dummy.next;
    }
}

分析:按照歸并排序的思路合并鏈表

輸入的k個排序鏈表可以分成兩部分,前k/2個鏈表和后k/2個鏈表。如果將前k/2個鏈表和后k/2個鏈表分別合并成兩個排序的鏈表,再將兩個排序的鏈表合并,那么所有鏈表都合并了。合并k/2個鏈表與合并k個鏈表是同一個問題,可以調(diào)用遞歸函數(shù)解決。文章來源地址http://www.zghlxwxcb.cn/news/detail-772842.html

public class Test {
    public static void main(String[] args) {
        ListNode listNode1 = new ListNode(1);
        ListNode listNode2 = new ListNode(2);
        ListNode listNode3 = new ListNode(3);
        ListNode listNode4 = new ListNode(4);
        ListNode listNode5 = new ListNode(5);
        ListNode listNode6 = new ListNode(6);
        ListNode listNode7 = new ListNode(7);
        ListNode listNode8 = new ListNode(8);
        ListNode listNode9 = new ListNode(9);

        listNode1.next = listNode4;
        listNode4.next = listNode7;

        listNode2.next = listNode5;
        listNode5.next = listNode8;

        listNode3.next = listNode6;
        listNode6.next = listNode9;

        ListNode[] lists = {listNode1, listNode2, listNode3};
        ListNode result = mergeKLists(lists);
        while (result != null) {
            System.out.println(result.val);
            result = result.next;
        }
    }

    public static ListNode mergeKLists(ListNode[] lists) {
        if (lists.length == 0) {
            return null;
        }

        return mergeLists(lists, 0, lists.length);
    }

    private static ListNode mergeLists(ListNode[] lists, int start, int end) {
        if (start + 1 == end) {
            return lists[start];
        }

        int mid = (start + end) / 2;
        ListNode head1 = mergeLists(lists, start, mid);
        ListNode head2 = mergeLists(lists, mid, end);
        return merge(head1, head2);
    }

    private static ListNode merge(ListNode head1, ListNode head2) {
        ListNode dummy = new ListNode(0);
        ListNode cur = dummy;
        while (head1 != null && head2 != null) {
            if (head1.val < head2.val) {
                cur.next = head1;
                head1 = head1.next;
            }
            else {
                cur.next = head2;
                head2 = head2.next;
            }

            cur = cur.next;
        }
        cur.next = head1 == null ? head2 : head1;
        return dummy.next;
    }
}

到了這里,關(guān)于面試算法78:合并排序鏈表的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 《劍指offer》——合并兩個排序的鏈表

    《劍指offer》——合并兩個排序的鏈表

    本期給大家?guī)淼氖??合并兩個排序的鏈表 這道題的講解!??! ?接下來,我們還是先從題干的內(nèi)容入手,先分析一波題目,在進(jìn)行畫圖思考操作。 ??? 題目如下: 示例1 輸入:{1,3,5},{2,4,6} 返回值:{1,2,3,4,5,6} 示例2 輸入:{},{} 返回值:{} 示例3 輸入:{-1,2,4},{1,3,4} 返回值:

    2023年04月13日
    瀏覽(15)
  • (鏈表) 劍指 Offer 25. 合并兩個排序的鏈表 ——【Leetcode每日一題】

    (鏈表) 劍指 Offer 25. 合并兩個排序的鏈表 ——【Leetcode每日一題】

    難度:簡單 輸入兩個遞增排序的鏈表,合并這兩個鏈表并使新鏈表中的節(jié)點仍然是遞增排序的。 示例1: 輸入:1-2-4, 1-3-4 輸出:1-1-2-3-4-4 限制 : 0 = 鏈表長度 = 1000 注意:本題與 21. 合并兩個有序鏈表 相同 ??思路: 法一:遞歸 將該問題可以分解成子鏈表,只比較當(dāng)前 l1 鏈

    2024年02月15日
    瀏覽(21)
  • 【Leetcode -21.合并兩個有序鏈表 -83.刪除排序鏈表中的重復(fù)元素】

    【Leetcode -21.合并兩個有序鏈表 -83.刪除排序鏈表中的重復(fù)元素】

    題目:將兩個升序鏈表合并為一個新的 升序 鏈表并返回。新鏈表是通過拼接給定的兩個鏈表的所有節(jié)點組成的。 示例 1: 輸入:l1 = [1, 2, 4], l2 = [1, 3, 4] 輸出:[1, 1, 2, 3, 4, 4] 示例 2: 輸入:l1 = [], l2 = [] 輸出:[] 示例 3: 輸入:l1 = [], l2 = [0] 輸出:[0] 我們的思路是,先定義

    2023年04月24日
    瀏覽(30)
  • 【C/C++練習(xí)】合并k個已排序的鏈表

    【C/C++練習(xí)】合并k個已排序的鏈表

    前言: ?今天給大家分享一道面試中常見的題目——合并K個升序鏈表,我會用暴力和分治兩鐘方法去求解這道題目,通過動圖展示問題求解的全過程。這里提醒大家,畫圖是我們求解復(fù)雜問題的有效手段,有時可以起到事半功倍的效果,各位小伙伴在做題的過程中如果遇到

    2024年02月09日
    瀏覽(21)
  • 面試熱題(合并K個升序鏈表)

    面試熱題(合并K個升序鏈表)

    給定一個鏈表數(shù)組,每個鏈表都已經(jīng)按升序排列。 請將所有鏈表合并到一個升序鏈表中,返回合并后的鏈表。 ? ? ? ?這道題看似困難題,其實還是比較容易好想的,我們可以維護(hù)一個優(yōu)先最小隊列,然后聲明一個虛擬頭結(jié)點,每次出一個最小的節(jié)點掛載在已經(jīng)掛載節(jié)點的后

    2024年02月12日
    瀏覽(17)
  • LeetCode150道面試經(jīng)典題-- 合并兩個有序鏈表(簡單)

    LeetCode150道面試經(jīng)典題-- 合并兩個有序鏈表(簡單)

    將兩個升序鏈表合并為一個新的 升序 鏈表并返回。新鏈表是通過拼接給定的兩個鏈表的所有節(jié)點組成的。? 示例 1: 輸入:l1 = [1,2,4], l2 = [1,3,4] 輸出:[1,1,2,3,4,4]? ? 示例 2: 輸入:l1 = [], l2 = [] 輸出:[] 示例 3: ? 輸入:l1 = [], l2 = [0] 輸出:[0] 遞歸調(diào)用 將這個問題不斷拆分

    2024年02月12日
    瀏覽(29)
  • Java 算法篇-鏈表的經(jīng)典算法:有序鏈表去重、合并多個有序鏈表

    Java 算法篇-鏈表的經(jīng)典算法:有序鏈表去重、合并多個有序鏈表

    ??博客主頁:?【 小扳_-CSDN博客】 ?感謝大家點贊??收藏?評論? ??? ? ? 文章目錄 ? ? ? ? ?1.0 鏈表的說明 ? ? ? ? ?2.0 有序鏈表去重的實現(xiàn)方式 ? ? ? ? 2.1 有序鏈表去重(保留重復(fù)的節(jié)點) -?使用遞歸來實現(xiàn) ? ? ? ? 2.2?有序鏈表去重(保留重復(fù)的節(jié)點) -?使用雙指針

    2024年02月05日
    瀏覽(23)
  • 【數(shù)據(jù)結(jié)構(gòu)】鏈表OJ面試題(《刪除定值、反轉(zhuǎn)、返回中間結(jié)點、倒數(shù)第k節(jié)點、合并鏈表》)+解析)

    【數(shù)據(jù)結(jié)構(gòu)】鏈表OJ面試題(《刪除定值、反轉(zhuǎn)、返回中間結(jié)點、倒數(shù)第k節(jié)點、合并鏈表》)+解析)

    還不清楚鏈表的碼喵們可以看看前篇關(guān)于鏈表的詳解 既然已經(jīng)懂得了鏈表該如何實現(xiàn),那么現(xiàn)在就趁熱打鐵開始練習(xí)!這里給碼喵們整理了相對不錯的一些OJ題來練習(xí) ?力扣(LeetCode)官網(wǎng) - 全球極客摯愛的技術(shù)成長平臺 思路:遍歷整個表,訪問每個表的值并且刪除再將nex

    2024年02月22日
    瀏覽(21)
  • 算法重溫:排序 —— 合并排序

    算法重溫:排序 —— 合并排序

    目錄 1. 基本思想 2. 排序原理 3. 排序過程 4.復(fù)雜度分析 5.代碼實現(xiàn) (C++、java) 6.運行結(jié)果 7.各排序算法效率 通過一趟排序?qū)⒋判蛄蟹指畛蓛刹糠郑渲幸徊糠钟涗浀木攘硪徊糠钟涗浀男?。之后分別對這兩部分記錄繼續(xù)進(jìn)行排序,以達(dá)到整個序列有序的目的。

    2024年02月07日
    瀏覽(16)
  • 排序算法-合并排序法(MergeSort)

    排序算法-合并排序法(MergeSort)

    合并排序法(MergeSort)是針對已排序好的兩個或兩個以上的數(shù)列(或數(shù)據(jù)文件),通過合并的方式將其組合成一個大的且已排好序的數(shù)列(或數(shù)據(jù)文件),步驟如下: 將個長度為1的鍵值成對地合并成個長度為2的鍵值組。 將個長度為2的鍵值組成對地合并成個長度為4的鍵值組

    2024年02月07日
    瀏覽(14)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包