Połącz k Listy posortowane Rozwiązanie Leetcode

Poziom trudności Ciężko
Często zadawane pytania Adobe Amazonka Apple Bloomberg ByteDance Facebook Google W rzeczy samej LinkedIn Microsoft wyrocznia Zraszacz VMware Yandex
Dziel i rządź kupa Połączona lista Shopee TIK Tok TuSimple Globalna technologia Walmartodwiedzajacy 48

Pytania do rozmowy kwalifikacyjnej na temat projektowania systemu może być tak nieograniczona, że ​​trudno jest określić właściwy sposób przygotowania. Teraz jestem w stanie złamać rundy projektowe Amazon, Microsoft i Adobe po zakupie ta książka. Codziennie poprawiaj jeden pytanie projektowe i obiecuję, że możesz złamać cały projekt.

Problem Statement

W ramach projektu Połącz k Listy posortowane Rozwiązanie LeetCode – „Połącz k posortowane listy” stwierdza, że ​​biorąc pod uwagę tablicę k połączonych list, gdzie każda podłączona lista ma swoje wartości posortowane w porządku rosnącym. Musimy scal wszystkie listy z linkami k w jedną połączoną listę i zwróć głowa połączonej listy.

Przykład:

Input:  lists = [[1,4,5],[1,3,4],[2,6]]
Output: [1,1,2,3,4,4,5,6]

Wyjaśnienie:

  • Rozważ wszystkie wartości w porządku rosnącym: [1, 1, 2, 3, 4, 4, 5, 6].
  • Musimy utworzyć połączoną listę z powyższymi wartościami.
Input:  lists = []
Output: []

Wyjaśnienie:

  • Tablica wejściowa jest pusta, zwróć wskaźnik null jako nagłówek połączonej listy.

Podejście

Idea:

  1. Główną ideą rozwiązania tego problemu jest użycie Kolejka priorytetowa.
  2. Iteruj w tablicy połączonych list i przechowuj wszystko pary {wartości, wskaźniki głowy} min-kupa.
  3.  Za każdym razem, wyskocz węzeł z minimalną wartością ze sterty min i spraw, aby następny węzeł nowo utworzonej połączonej listy.
  4. Sprawdź też jeśli wyrzucony węzeł ma następny węzeł, następnie wstaw parę {wartość, następny węzeł} ponownie w min-stercie.
  5. Powyższy proces powoduje utworzenie nowej połączonej listy ze wszystkimi wartościami posortowanymi w porządku rosnącym, ponieważ za każdym razem wyodrębniamy węzeł o minimalnej wartości i czynimy go kolejnym węzłem nowej połączonej listy.
  6. Na koniec połączyliśmy k list połączonych.

Kod

Połącz k posortowanych list Leetcode C++ Rozwiązanie:

class Solution {
public:
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        if(lists.empty()){
            return nullptr;
        }
        ListNode* dummy = new ListNode(0);
        ListNode* head = dummy;
        priority_queue<pair<int,ListNode*>,vector<pair<int,ListNode*>>,greater<pair<int,ListNode*>>> pq;
        for(auto& node:lists){
            if(node!=nullptr){
                pq.push({node->val,node});
            }
        }
        while(!pq.empty()){
            ListNode* node = pq.top().second;
            pq.pop();
            if(node->next!=nullptr){
                pq.push({node->next->val,node->next});
            }
            dummy->next = node;
            dummy = node;
        }
        return head->next;
    }
};

Scalanie posortowanych list Leetcode Java Rozwiązanie:

class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
        if(lists.length==0){
            return null;
        }
        PriorityQueue<ListNode> pq = new PriorityQueue<ListNode>(lists.length, (a,b)-> a.val-b.val);
        for(ListNode node:lists){
            if(node!=null){
                pq.add(node);
            }
        }
        ListNode dummy = new ListNode(0);
        ListNode head = dummy;
        while(!pq.isEmpty()){
            ListNode node = pq.poll();
            if(node.next!=null){
                pq.add(node.next);
            }
            dummy.next = node;
            dummy = node;
        }
        return head.next;
    }
}

Analiza złożoności dla Merge k Listy posortowane Rozwiązanie Leetcode

Złożoność czasowa

Złożoność czasowa powyższego kodu wynosi O(NKlogK). Każdy węzeł jest wpychany do min-sterty raz i są łącznie najwyżej N*K węzły w danej tablicy połączonych list, gdzie N = maksymalna liczba węzłów w pojedynczej połączonej liście i K = rozmiar tablicy połączonej listy.

Złożoność przestrzeni

Złożoność przestrzeni powyższego kodu wynosi DOBRZE) ponieważ używamy kopca min o maksymalnym rozmiarze k.

 

Odniesienie:- https://en.wikipedia.org/wiki/Linked_list

Wywiady dotyczące projektowania systemu pękania
Translate »