• Merge k Sorted Lists


    Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.

     

    思路:要快速找到k个元素中的最小值,使用堆这种数据结构。找到最小值后,还需要知道该最小值出自哪个链表,因此,堆中还需记录每个节点来自哪个链表。调整堆的时间复杂度为O(logk),所以总体时间复杂度为O(nlogk)。代码如下:

    struct ListNode 
    {
    	int val;
    	struct ListNode *next;
    };
    
    typedef struct
    {
        int val;
        int index;
    }HeapNode;
    
    void swap(HeapNode *a, HeapNode *b)
    {
        HeapNode temp;
        temp = *b;
        *b = *a;
        *a = temp;
    }
    
    void minheapify(HeapNode *heap, int heapsize, int index)
    {
        int left, right;
        int key;
        
        int smallest;
        while(index < heapsize)
        {
            left = 2*index+1;
            right = 2*index+2;
            smallest = index;
            if(left < heapsize && heap[index].val > heap[left].val)
            {
                smallest = left;
            }
            if(right < heapsize && heap[smallest].val > heap[right].val)
            {
                smallest = right;
            }
            
            if(smallest == index)   return;
            swap(heap+smallest, heap+index);
            index = smallest;
        }
    }
    
    void buildminheap(HeapNode *heap, int heapsize)
    {
        int start = (heapsize-2)/2;
        
        while(start >= 0)
        {
            minheapify(heap, heapsize, start);
            start--;
        }
    }
    
    struct ListNode* mergeKLists(struct ListNode** lists, int listsSize) 
    {
        int i ,j;
        int heapsize = listsSize;
        int minindex = -1;
        struct ListNode *head = NULL;
        struct ListNode *node = NULL;
        
        if(listsSize == 0)  return head;
        HeapNode *heap = calloc(heapsize, sizeof(HeapNode));
        for(i = 0, j = 0; i < heapsize; i++)
        {
            if(lists[i] == NULL)
            {
                continue;
            }
            heap[j].val = lists[i]->val;
            heap[j].index = i;
            j++;
        }
        heapsize = j;
        if(heapsize == 0)   return head;
        
        buildminheap(heap, heapsize);
        minindex = heap[0].index;
        head = lists[minindex];
        node = head;
        lists[minindex] = lists[minindex]->next;
        while(1)
        {
            if(lists[minindex] == NULL)
            {
                heapsize -= 1;
                if(heapsize == 0)   return head;
                swap(heap, heap+heapsize);
                minheapify(heap, heapsize, 0);
            }
            else
            {
                heap[0].val = lists[minindex]->val;
                minheapify(heap, heapsize, 0);
            }
            minindex = heap[0].index;
            node->next = lists[minindex];
            node = node->next;
            lists[minindex] = lists[minindex]->next;
        }
    }
    

      

     

  • 相关阅读:
    实验二
    实验一
    网络对抗技术 实验四 恶意代码技术
    网络对抗技术 实验三 密码破解技术
    网络对抗技术 实验二 网络嗅探与欺骗
    网络对抗技术 实验一 网络侦查与网络扫描
    实验6
    实验5
    caogao
    实验四
  • 原文地址:https://www.cnblogs.com/gqtcgq/p/7247151.html
Copyright © 2020-2023  润新知