Обједини К сортиране повезане листе  


Ниво тешкоће Тежак
Често питани у адобе амазонка јабука Блоомберг БитеДанце Датабрицкс еБаи фацебоок Голдман Сакс мицрософт пророчанство Палантир Тецхнологиес твиттер Убер Жеља
Завади па владај гомила Повезана листа

Спајање К сортирано повезане листе проблем је толико познат по гледишту интервјуа. Ово питање се поставља толико пута у великим компанијама попут Гоогле-а, Мицрософт-а, Амазон-а итд. Као што и само име говори, добили смо к сортиране повезане листе. Морамо их спојити заједно у а Једна сортирана повезана листа.

Хајде да погледамо пример тест случаја да бисмо га боље разумели:

Пример  

Улазни

[

1-> 2-> 3,

1-> 4-> 6,

2-> 3

]

Излаз

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

Приступ-1 за обједињене повезане листе  

Бруте Форце 

  • Пређите све повезане листе и ставите све вредности у Арраи / АрраиЛист / Вецтор (Које год складиште сматрате погодним)
  • Сортирај податке
  • Из сортираних података направите нову повезану листу

Воила! Наша обједињена и сортирана повезана листа је спремна. Хајде да то боље схватимо помоћу кода.

Јава Програм

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;
    }
}

Програм Ц ++

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

Анализа сложености

Погледајмо сада временску сложеност горњег решења:

Види такође
Напишите функцију да бисте добили тачку пресека две повезане листе

Време је потребно за прелазак и стварање: О (н)

Време је потребно за сортирање: О (н лог н)

Усложњавање времена: О (н лог н)

Приступ-2 за обједињене повезане листе  

Коришћење Мин-Хеап-а

Приоритетни ред се може користити као складиште

Предности:

  • Нема потребе за сортирањем

Погледајмо исто уз помоћ кода

Јава Програм

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

Анализа сложености

Временска сложеност горе наведеног: О (н лог н)

Приступ-3 за обједињене повезане листе  

Завади па владај

  • Корак поделе

ЦИЉ-Шаље к листе ради обједињавања функције к / 2

  • Корак спајања

ОБЈЕКТИВАН-Да бисте размотрили мање вредности и додали их да бисте креирали нову листу

    • Направите показивач за враћање комбиноване листе
    • Додајте мању вредност са било које листе
    • Показивач увећања из којег је преузета вредност
    • Врати обједињену и сортирану повезану листу са две листе
Обједини К сортиране повезане листеПин
Приказује се спајање неколико листа

Хајде да то боље схватимо уз помоћ кода

Јава Програм

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);   
    }
}

Програм Ц ++

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

Анализа сложености

Сложеност времена = О (н лог н)

Види такође
Алгоритам Беллман Форд

Сложеност простора = О (1)

Референце