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

【力扣每日一題】23. 合并 K 個(gè)升序鏈表 &暴力法-快排 & 8.12打卡

這篇具有很好參考價(jià)值的文章主要介紹了【力扣每日一題】23. 合并 K 個(gè)升序鏈表 &暴力法-快排 & 8.12打卡。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

【力扣每日一題】23. 合并 K 個(gè)升序鏈表 &暴力法-快排 & 8.12打卡,暑期算法沖刺,leetcode,鏈表,算法,原力計(jì)劃

題目

合并 K 個(gè)升序鏈表

難度: 困難

描述:

給你一個(gè)鏈表數(shù)組,每個(gè)鏈表都已經(jīng)按升序排列。

請你將所有鏈表合并到一個(gè)升序鏈表中,返回合并后的鏈表。

示例 1:

輸入:lists = [[1,4,5],[1,3,4],[2,6]]
輸出:[1,1,2,3,4,4,5,6]
解釋:鏈表數(shù)組如下:
[
1->4->5,
1->3->4,
2->6
]
將它們合并到一個(gè)有序鏈表中得到。
1->1->2->3->4->4->5->6

示例 2:

輸入:lists = []
輸出:[]

示例 3:

輸入:lists = [[]]
輸出:[]

提示:

k == lists.length
0 <= k <= 10^4
0 <= lists[i].length <= 500
-10^4 <= lists[i][j] <= 10^4
lists[i] 按 升序 排列
lists[i].length 的總和不超過 10^4

思路

時(shí)間復(fù)雜度分析:因?yàn)樵试Sk的長度為10^4,所以O(shè)(n2)是肯定過不去的,可以使用O(nlogn)或者更低,提示中標(biāo)紅處是我們需要注意的地方
解法思路:本題我使用的是暴力解法,首先先將這個(gè)鏈表集合中的所有元素進(jìn)行合并,生成一個(gè)長的鏈表,因?yàn)樽渔湵淼拈L度在500范圍內(nèi),所以時(shí)間復(fù)雜度最終會是O(n),同時(shí)使用快速排序進(jìn)行排序,最終時(shí)間復(fù)雜度在O(nlogn)

代碼

先將鏈表集合中的所有子鏈表合成一條鏈表:

 public static ListNode mergeKLists(ListNode[] lists) {
        int k = lists.length;
        ListNode dummy = new ListNode(-1);
        ListNode tail = dummy;
        for(int  i =0;i<k;i++){
            while(lists[i] != null){
                ListNode temp = lists[i];
                lists[i] = lists[i].next;
                tail.next= temp;
                tail = tail.next;
            }
        }
        return quickSort(dummy.next);
    }

然后對鏈表進(jìn)行快速排序:
快速排序思路:設(shè)置一個(gè)中間值,將小于該值的數(shù)放在左邊,大于的放在右邊
針對本題:設(shè)置三個(gè)鏈表,一個(gè)存儲小于的值,一個(gè)存儲等于的值,一個(gè)存儲大于的值

public static  ListNode quickSort(ListNode head){
        if(head == null || head.next == null){
            return head;
        }
        ListNode pivot = head;
        ListNode lessHead = new ListNode(-1);
        ListNode lessTail = lessHead;
        ListNode biggerHead = new ListNode(-1);
        ListNode biggerTail = biggerHead;
        ListNode equalHead = new ListNode(-1);
        ListNode equalTail = equalHead;

        ListNode current = head;
        while(current != null){
            if(current.val < pivot.val){
                lessTail.next = current;
                lessTail=lessTail.next;
            }else if(current.val > pivot.val){
                biggerTail.next = current;
                biggerTail = biggerTail.next;
            }else{
                equalTail.next = current;
                equalTail = equalTail.next; 
            }
            current = current.next;
        }
        lessTail.next =null;
        biggerTail.next =null;
        equalTail.next = null;
        
        ListNode sortedLess = quickSort(lessHead.next);
        ListNode sortedBigger = quickSort(biggerHead.next);
        return concer(sortedLess,equalHead.next,sortedBigger);
    }

然后分別從小到大,依此添加到鏈表中:

 public static ListNode concer(ListNode less,ListNode euqal,ListNode bigger){
        ListNode dummyhead = new ListNode(-1);
        ListNode tail = dummyhead;

        tail.next = less;
        tail = getTail(tail);
        tail.next =euqal ;
        tail = getTail(tail);
        tail.next = bigger;
    

        return dummyhead.next;
    }
    public static ListNode getTail(ListNode head){
        if(head == null){
            return null;
        }
        while(head.next != null){
            head = head.next;
        }
        return head;
    }

我這里使用了最簡單的方法,還有很多優(yōu)質(zhì)的解法,可以參考力扣中大神的做法。

完整代碼:文章來源地址http://www.zghlxwxcb.cn/news/detail-642410.html

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    //暴力解法
    public static ListNode mergeKLists(ListNode[] lists) {
        int k = lists.length;
        ListNode dummy = new ListNode(-1);
        ListNode tail = dummy;
        for(int  i =0;i<k;i++){
            while(lists[i] != null){
                ListNode temp = lists[i];
                lists[i] = lists[i].next;
                tail.next= temp;
                tail = tail.next;
            }
        }
        return quickSort(dummy.next);
    }
    public static  ListNode quickSort(ListNode head){
        if(head == null || head.next == null){
            return head;
        }
        ListNode pivot = head;
        ListNode lessHead = new ListNode(-1);
        ListNode lessTail = lessHead;
        ListNode biggerHead = new ListNode(-1);
        ListNode biggerTail = biggerHead;
        ListNode equalHead = new ListNode(-1);
        ListNode equalTail = equalHead;

        ListNode current = head;
        while(current != null){
            if(current.val < pivot.val){
                lessTail.next = current;
                lessTail=lessTail.next;
            }else if(current.val > pivot.val){
                biggerTail.next = current;
                biggerTail = biggerTail.next;
            }else{
                equalTail.next = current;
                equalTail = equalTail.next; 
            }
            current = current.next;
        }
        lessTail.next =null;
        biggerTail.next =null;
        equalTail.next = null;
        
        ListNode sortedLess = quickSort(lessHead.next);
        ListNode sortedBigger = quickSort(biggerHead.next);
        return concer(sortedLess,equalHead.next,sortedBigger);
    }
    public static ListNode concer(ListNode less,ListNode euqal,ListNode bigger){
        ListNode dummyhead = new ListNode(-1);
        ListNode tail = dummyhead;

        tail.next = less;
        tail = getTail(tail);
        tail.next =euqal ;
        tail = getTail(tail);
        tail.next = bigger;
    

        return dummyhead.next;
    }
    public static ListNode getTail(ListNode head){
        if(head == null){
            return null;
        }
        while(head.next != null){
            head = head.next;
        }
        return head;
    }
}

到了這里,關(guān)于【力扣每日一題】23. 合并 K 個(gè)升序鏈表 &暴力法-快排 & 8.12打卡的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 合并K個(gè)升序鏈表(LeetCode 23)

    合并K個(gè)升序鏈表(LeetCode 23)

    給你一個(gè)鏈表數(shù)組,每個(gè)鏈表都已經(jīng)按升序排列。 請你將所有鏈表合并到一個(gè)升序鏈表中,返回合并后的鏈表。 示例 1: 示例 2: 示例 3: Hard。 ★★★★☆ 我們可以想到一種最樸素的方法,依次將鏈表數(shù)組中的鏈表與最終結(jié)果合并。問題便退化成合并兩個(gè)有序鏈表。 如何

    2024年01月19日
    瀏覽(16)
  • LeetCode 23 合并 K 個(gè)升序鏈表

    LeetCode 23 合并 K 個(gè)升序鏈表

    來源:力扣(LeetCode) 鏈接:https://leetcode.cn/problems/merge-k-sorted-lists/description/ 博主Github :https://github.com/GDUT-Rp/LeetCode 給你一個(gè)鏈表數(shù)組,每個(gè)鏈表都已經(jīng)按升序排列。 請你將所有鏈表合并到一個(gè)升序鏈表中,返回合并后的鏈表。 示例1 : 示例2 : 示例3 : 提示: k == lists.length

    2024年02月10日
    瀏覽(16)
  • Leetcode—23.合并 K 個(gè)升序鏈表【困難】

    Leetcode—23.合并 K 個(gè)升序鏈表【困難】

    用容量為K的最小堆優(yōu)先隊(duì)列,把鏈表的頭結(jié)點(diǎn)都放進(jìn)去,然后出隊(duì)當(dāng)前優(yōu)先隊(duì)列中最小的,掛上鏈表,,然后讓出隊(duì)的那個(gè)節(jié)點(diǎn)的下一個(gè)入隊(duì),再出隊(duì)當(dāng)前優(yōu)先隊(duì)列中最小的,直到優(yōu)先隊(duì)列為空。 之后我會持續(xù)更新,如果喜歡我的文章,請記得一鍵三連哦,點(diǎn)贊關(guān)注收藏,

    2024年01月25日
    瀏覽(25)
  • 2023-09-06力扣每日一題-擺爛暴力

    鏈接: [1123. 最深葉節(jié)點(diǎn)的最近公共祖先](https://leetcode.cn/problems/form-smallest-number-from-two-digit-arrays/) 題意: 如題 解: 今天搞一手暴力,按層存,按層取,直到只取到一個(gè) 實(shí)際代碼: 限制: 樹中的節(jié)點(diǎn)數(shù)將在 [1, 1000] 的范圍內(nèi)。 0 = Node.val = 1000 每個(gè)節(jié)點(diǎn)的值都是 獨(dú)一無二 的。

    2024年02月09日
    瀏覽(25)
  • 2023-08-23力扣每日一題

    鏈接: 1782. 統(tǒng)計(jì)點(diǎn)對的數(shù)目 題意: 給n個(gè)點(diǎn)和m條無向邊(可重復(fù)),q個(gè)查詢 定義 edge[a] 為一個(gè)點(diǎn)是a的邊數(shù)量,定義 ret[a,b] 是 edge[a]+edge[b]-(a與b的邊) q個(gè)查詢q個(gè)答案,第i次查詢值 val[i] ,求所有的 1=ab=n 條件下有多少 ret[a,b]val[i] 解: TLE卡47了 看了評論區(qū)用空間換時(shí)間,

    2024年02月10日
    瀏覽(22)
  • 【力扣每日一題】2023.7.23 接雨水

    【力扣每日一題】2023.7.23 接雨水

    目錄 題目: 示例: 分析: 代碼+運(yùn)行結(jié)果: 接雨水是力扣里非常經(jīng)典的一道單調(diào)棧的題目,使用單調(diào)棧的做法就是從左到右將高度依次入棧,保持棧內(nèi)從棧頂開始升序,在遇到比棧頂更高的高度后,則彈出棧頂元素,并開始按行來計(jì)算所積雨水?dāng)?shù)量,再將后面來的高度入棧

    2024年02月15日
    瀏覽(8)
  • 力扣每日一題88:合并兩個(gè)有序數(shù)組

    給你兩個(gè)按? 非遞減順序 ?排列的整數(shù)數(shù)組? nums1 ? 和? nums2 ,另有兩個(gè)整數(shù)? m ?和? n ?,分別表示? nums1 ?和? nums2 ?中的元素?cái)?shù)目。 請你? 合并 ? nums2 ? 到? nums1 ?中,使合并后的數(shù)組同樣按? 非遞減順序 ?排列。 注意: 最終,合并后數(shù)組不應(yīng)由函數(shù)返回,而是存儲在

    2024年02月07日
    瀏覽(24)
  • 【力扣每日一題】2023.8.27 合并區(qū)間

    【力扣每日一題】2023.8.27 合并區(qū)間

    目錄 題目: 示例: 分析: 代碼: 那么合并區(qū)間是在什么情況下才能合并呢? 我總結(jié)為兩種情況 第一種情況就是這樣,第二個(gè)區(qū)間的左區(qū)間大于第一個(gè)區(qū)間的左區(qū)間但是小于第一個(gè)區(qū)間的右區(qū)間,并且第一個(gè)區(qū)間的右區(qū)間小于第二個(gè)區(qū)間的右區(qū)間,這種情況下合并的結(jié)果就

    2024年02月11日
    瀏覽(17)
  • 力扣每日一題86:分隔鏈表

    力扣每日一題86:分隔鏈表

    給你一個(gè)鏈表的頭節(jié)點(diǎn)? head ?和一個(gè)特定值 ? x ?,請你對鏈表進(jìn)行分隔,使得所有? 小于 ? x ?的節(jié)點(diǎn)都出現(xiàn)在? 大于或等于 ? x ?的節(jié)點(diǎn)之前。 你應(yīng)當(dāng)? 保留 ?兩個(gè)分區(qū)中每個(gè)節(jié)點(diǎn)的初始相對位置。 示例 1: 示例 2: 提示: 鏈表中節(jié)點(diǎn)的數(shù)目在范圍? [0, 200] ?內(nèi) -100 = N

    2024年02月07日
    瀏覽(17)
  • 【力扣每日一題】2023.8.13 合并兩個(gè)有序數(shù)組

    【力扣每日一題】2023.8.13 合并兩個(gè)有序數(shù)組

    目錄 題目: 示例: 分析: 代碼: 題目給我們兩個(gè)升序數(shù)組,讓我們合并它們,要求合并之后仍然是升序,并且這個(gè)合并操作是在數(shù)組1原地修改的。數(shù)組1的有效數(shù)據(jù)長度為 m ,而數(shù)組1的長度為 m + n,n 是數(shù)組2的有效數(shù)據(jù)長度以及數(shù)組的長度。 比較直觀容易想到的做法就是

    2024年02月12日
    瀏覽(26)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包