【leetcode】Merge k Sorted Lists

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


O(N * logK)

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode **g_lists;
int g_num;
#define max_num 10000
struct ListNode *g_heap[max_num];
int heap_num;

void rebuildHeap(int i) {
    int left = i * 2 + 1;
    int right = i * 2 + 2;
    if (left >= heap_num) {
        return;
    }
    int min = i;
    if (g_heap[i]->val > g_heap[left]->val) {
        min = left;
    }
    if (right < heap_num && g_heap[min]->val > g_heap[right]->val) {
        min = right;
    }
    if (min == i) {
        return;
    }
    struct ListNode *tmp = g_heap[i];
    g_heap[i] = g_heap[min];
    g_heap[min] = tmp;
    rebuildHeap(min);
}

void makeHeap() {
    for (int i = heap_num / 2; i >= 0; --i) {
        rebuildHeap(i);
    }
}

struct ListNode *pickOne() {
    if (heap_num == 0) {
        return NULL;
    }
    struct ListNode *min = g_heap[0];
    if (min->next == NULL) {
        heap_num--;
        g_heap[0] = g_heap[heap_num];
    } else {
        g_heap[0] = g_heap[0]->next;
    }
    rebuildHeap(0);
    min->next = NULL;
    return min;
}

struct ListNode *mergeKLists(struct ListNode *lists[], int k) {
    if (k == 0) {
        return NULL;
    }
    if (k == 1) {
        return lists[0];
    }

    g_num = k;
    g_lists = lists;
    heap_num = 0;
    for (int i = 0; i < g_num; ++i) {
        if (g_lists[i] != NULL) {
            g_heap[heap_num++] = g_lists[i];
        }
    }
    makeHeap();
    
    struct ListNode *head = NULL;
    struct ListNode *cur = NULL;
    struct ListNode *p = NULL;
    
    while ((p = pickOne()) != NULL) {
        if (head == NULL) {
            head = p;
        } else {
            cur->next = p;
        }
        cur = p;
    }
    
    return head;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值