Միավորել K Տեսակավորված Կապված istsուցակները


Դժվարության մակարդակ Դժվար
Հաճախակի հարցնում են Adobe Amazon խնձոր Bloomberg ByteDance Տվյալների շտեմարաններ eBay facebook Goldman Sachs-ը Microsoft Պատգամախոս Պալանտիր տեխնոլոգիաներ ծլվլոց Uber Ցանկություն
Բաժանել եւ նվաճել Կույտ Կապված ցուցակ

Merge K տեսակավորված կապված ցուցակներ խնդիրն այնքան հայտնի է, ըստ հարցազրույցի տեսակետի: Այս հարցը շատ անգամ է տալիս այնպիսի խոշոր ընկերություններում, ինչպիսիք են Google- ը, Microsoft- ը, Amazon- ը և այլն: Քանի որ անունն է հուշում, մեզ տրամադրվել են k տեսակավորված կապված ցուցակներ: Մենք պետք է դրանք միասին միավորենք ա Միայնակ տեսակավորված կապակցված ցուցակ.

Եկեք ուսումնասիրենք փորձանմուշի նմուշը ՝ այն ավելի լավ հասկանալու համար.

Օրինակ

Մուտքային

[

1-> 2-> 3,

1-> 4-> 6,

2-> 3

]

Արտադրողականություն

1->1->2->2->3->3->4->6

Միացում K- ի Տեսակավորված կապակցված ցուցակների միացում

Ամենակոպիտ բռնությունների կիրառումը 

  • Անցեք բոլոր կապակցված ցուցակները և տեղադրեք բոլոր արժեքները Array / ArrayList / Vector (ինչպիսի պահեստ էլ գտնեք հարմար)
  • Տեսակավորեք տվյալները
  • Տեսակավորված տվյալներից ստեղծեք նոր կապակցված ցուցակ

Voila! Մեր միավորված և տեսակավորված կապակցված ցուցակը պատրաստ է: Եկեք դա ավելի լավ հասկանանք կոդով:

Java ծրագիր

class Solution 
{
    public ListNode mergeKLists(ListNode[] lists) 
    {
        ListNode aux=new ListNode(0);
        List<Integer>lisa=new ArrayList<Integer>();
        for(int i=0;i<lists.length;i++)
        {
            ListNode ptr=lists[i];
            while(ptr!=null)
            {
                lisa.add(ptr.val);
                ptr=ptr.next;
            }
        }
        Collections.sort(lisa);
        ListNode ptr=aux;
        for(int i=0;i<lisa.size();i++)
        {
            ListNode temp=new ListNode(lisa.get(i));
            temp.next=null;
            ptr.next=temp;
            ptr=ptr.next;
        }
        return aux.next;
    }
}

C ++ ծրագիր

class Solution 
{
public:
    ListNode* mergeKLists(vector<ListNode*>& lists) 
    {
    vector<int>store;
    for(int i=0;i<lists.size();i++)
        {
            ListNode *ptr=lists[i];
            while(ptr!=NULL)
            {
                store.push_back(ptr->val);
                ptr=ptr->next;
            }
        }
        sort(store.begin(),store.end());
        ListNode *ptr=new ListNode();
        ListNode *aux=ptr;
        for(int i=0;i<store.size();i++)
        {
            ListNode *temp=new ListNode(store[i]);
            temp->next=NULL;
            ptr->next=temp;
            ptr=ptr->next;
        }
        return aux->next;
    }
};
[

1->2->3,

1->4->6,

2->3

]
1->1->2->2->3->3->4->6

Բարդության վերլուծություն

Եկեք այժմ ուսումնասիրենք վերը նշված լուծման ժամանակի բարդությունը.

Isամանակը հատվում է անցնելու և ստեղծելու համար. O (n)

Տեսակավորման համար ժամանակ է հատկացված. O (n log n)

Akingամանակի բարդությունը կազմելը. O (n մուտք n)

Միացում K- ի Տեսակավորված կապակցված ցուցակների միացում

Օգտագործելով Min-Heap- ը

Գերակա հերթը կարող է օգտագործվել որպես պահեստ

Առավելությունները.

  • Տեսակավորման կարիք չկա

Եկեք նույնը ուսումնասիրենք կոդի միջոցով

Java ծրագիր

class Solution 
{
    public ListNode mergeKLists(ListNode[] lists)
    {
    Queue<Integer>store=new PriorityQueue();
    for(int i=0;i<lists.length;i++)
    {
        ListNode ptr=lists[i];
        while(ptr!=null)
        {
            store.add(ptr.val);
            ptr=ptr.next;
        }
    }
    if(store.isEmpty() )    
        return null;
    ListNode head=new ListNode(store.poll());
    ListNode cur=head;
    while(!store.isEmpty())
    {
        ListNode temp=new ListNode(store.poll());
        cur.next=temp;
        cur=cur.next;
    }
    return head;
    }
}
[
2->5->7->9,
1->2->3->->10
]
1->2->2->3->5->7->9->10

Բարդության վերլուծություն

Վերոհիշյալի ժամանակի բարդությունը. O (n մուտք n)

Միացում K- ի Տեսակավորված կապակցված ցուցակների միացում

Բաժանել եւ նվաճել

  • Բաժանման քայլը

ՆՊԱՏԱԿԸ-Կուղարկում է k ցուցակներ k / 2 գործառույթը ժամանակին միաձուլելու համար

  • Միաձուլման քայլը

ՆՊԱՏԱԿ -Ավելի փոքր արժեքներ դիտարկել և ավելացնել դրանք ՝ նոր ցուցակ ստեղծելու համար

    • Ստեղծեք ցուցիչ ՝ համակցված ցուցակը վերադարձնելու համար
    • Eitherանկացած ցուցակից ավելացրեք փոքր արժեքը
    • Ավելացման ցուցիչ, որից վերցված է արժեքը
    • Վերադարձեք միավորված և տեսակավորված կապակցված ցուցակը երկու ցուցակից
Միավորել K Տեսակավորված Կապված istsուցակները
Մի քանի ցուցակների միաձուլում

Եկեք դա ավելի լավ հասկանանք կոդի օգնությամբ

Java ծրագիր

class Solution 
{
    public static ListNode merge(ListNode l1,ListNode l2)
    {
        if(l1==null)
            return l2;
        if(l2==null)
            return l1;
        ListNode aux=new ListNode();
        ListNode head=aux;
        while(l1!=null && l2!=null)
        {
            if(l1.val>l2.val)
            {
                aux.next=l2;
                l2=l2.next;
            }
            else 
            {
                aux.next=l1;
                l1=l1.next;
            }
            aux=aux.next;
        }
        if(l1!=null)
            aux.next=l1;
        else if(l2!=null)
            aux.next=l2;
        return head.next;
    }
    public static ListNode divide(ListNode[]lists,int start,int end)
    {
        if(end<start)
            return null;
        if(end==start)
            return lists[start];
        int mid=start+(end-start)/2;
        return(merge(divide(lists,start,mid),divide(lists,mid+1,end)));
    }
    public ListNode mergeKLists(ListNode[] lists)
    {
     if(lists == null) 
         return null;
     if(lists.length == 1) 
         return lists[0];
     return divide(lists,0,lists.length-1);   
    }
}

C ++ ծրագիր

class Solution 
{
  public:
    ListNode* merge(ListNode *l1,ListNode *l2)
    {
        if(l1==NULL)
            return l2;
        if(l2==NULL)
            return l1;
        ListNode *aux=new ListNode();
        ListNode *head=aux;
        while(l1!=NULL && l2!=NULL)
        {
            if(l1->val>l2->val)
            {
                aux->next=l2;
                l2=l2->next;
            }
            else 
            {
                aux->next=l1;
                l1=l1->next;
            }
            aux=aux->next;
        }
        if(l1!=NULL)
            aux->next=l1;
        else if(l2!=NULL)
            aux->next=l2;
        return head->next;
    }
    public:
    ListNode* divide(vector<ListNode*>&lists,int start,int end)
    {
        if(end<start)
            return NULL;
        if(end==start)
            return lists[start];
        int mid=start+(end-start)/2;
        return(merge(divide(lists,start,mid),divide(lists,mid+1,end)));
    }
    public:
    ListNode* mergeKLists(vector<ListNode*>& lists) 
    {
     if(lists.size() == 0) 
         return NULL;
     if(lists.size() == 1) 
         return lists[0];
     return divide(lists,0,lists.size()-1);   
    }
};
[
1->2,
3,
4->5->6->7,
8->9->10,
11
]
1->2->3->4->5->6->7->8->9->10->11

Բարդության վերլուծություն

Timeամանակի բարդությունը = O (n log n)

Տիեզերական բարդությունը = O (1)

Սայլակ