#include <stdlib.h>
/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 * };
 */

/**
 * @author Senky
 * @date 2023.04.21
 * @par url https://www.nowcoder.com/creation/manager/content/584337070?type=column&status=-1
 * @brief 将数据重新排列不影响链表的位置
 * @param lists ListNode类一维数组 
 * @param listsLen int lists数组长度
 * @return ListNode类
 */

int compar(const void* p1, const void* p2)
 {
    return (  (*(int*)p1) -
              (*(int*)p2)   );
 }

struct ListNode* mergeKLists(struct ListNode** lists, int listsLen ) {
    // write code here
    int str_length = 0;
    int lists_index = 0;
    int str_index = 0;

    struct ListNode* head = NULL;
    struct ListNode* p = NULL;

    //整合链表
    for(lists_index = 0; lists_index < listsLen; lists_index++) //每次处理一条链表
    {
        if(lists[lists_index])//当前链表必须为非空链表
        {
            if(p) 
            {
                /*p链接并指向新非空链表的头结点*/
                p->next = lists[lists_index];
                p = lists[lists_index];
            }
            else 
            {
                /*p为空说明是第一次链接链表,将p指向第一个非空链表的头结点*/
                head = lists[lists_index];
                p = lists[lists_index];
            } 

            while(p)//仅对本条链表循环
            {
                str_length++;//计数结点数,结点数等于要申请空间的数组长度
                /*p的下一个为空并且,链表还没处理完,则退出循环,for寻找下一跳链表*/
                if(p->next == NULL && (lists_index < listsLen - 1) )
                {
                    break;
                }
                p = p->next;
            }         
            
        }
    }
        
    /*申请数组*/
    int* str = malloc(str_length*sizeof(int));  

    /*将链接后的链表数据域写入到整数数组中*/
    {
        p = head;
        while(p)
        {
            str[str_index++] = p->val;
            p = p->next;
        }
    }


    //排序整数数组,快排O(nlongn)
    qsort(str, str_length, sizeof(str[0]), compar);

    /*将排序好的数组元素写回链表的数据域*/
    {
        p = head;
        str_index = 0;
        while(p)
        {
            p->val = str[str_index++];
            p = p->next;
        }
    }

    return head;
}