/*
* 请给出一个时间为O(nlgk),用来将k个已排序链表合并为一个排序链表的算法。
* 此处n为所有输入链表中元素的总数。(提示:用一个最小堆来做k路合并)
*
* 思路:利用有k个元素的最小堆有lgk的复杂度,
* 所以堆的元素组成要每个链表的一个元素组成
*
* 具体步骤:
*step1:取每个链表的第一个元素,构造成一个含有k个元素的堆
*step2:把根结点的值记入排序结果中。
*step3:判断根结点所在的链表,若该链表为空,则go to step4,否则go to step5
*step4:删除根结点,调整堆,go to step2
*step5:把根结点替换为原根结点所在链表中的第一个元素,调整堆,go to step 2
*/
#include <stdio.h>
#include <stdlib.h>
#define PARENT(i) (i) / 2 // parent of i
#define LEFT(i) (i) << 1 // left child
#define RIGHT(i) ((i) << 1) + 1 // right child
#define swap(a, b, t) { (t) = (a); (a) = (b); (b) = (t); }
#define N 5
#define MAXV
* 请给出一个时间为O(nlgk),用来将k个已排序链表合并为一个排序链表的算法。
* 此处n为所有输入链表中元素的总数。(提示:用一个最小堆来做k路合并)
*
* 思路:利用有k个元素的最小堆有lgk的复杂度,
* 所以堆的元素组成要每个链表的一个元素组成
*
* 具体步骤:
*step1:取每个链表的第一个元素,构造成一个含有k个元素的堆
*step2:把根结点的值记入排序结果中。
*step3:判断根结点所在的链表,若该链表为空,则go to step4,否则go to step5
*step4:删除根结点,调整堆,go to step2
*step5:把根结点替换为原根结点所在链表中的第一个元素,调整堆,go to step 2
*/
#include <stdio.h>
#include <stdlib.h>
#define PARENT(i) (i) / 2 // parent of i
#define LEFT(i) (i) << 1 // left child
#define RIGHT(i) ((i) << 1) + 1 // right child
#define swap(a, b, t) { (t) = (a); (a) = (b); (b) = (t); }
#define N 5
#define MAXV