试了三种方法
第一种:先把所有链表首尾相接,之后再利用冒泡排序。
struct ListNode p1;
struct ListNode p2;
struct ListNode p3;
struct ListNode phead;
p0=NULL;
p1=NULL;
int n=0;
将k个链表合并到一起
if(listsLen==1)
{
return lists[0];
}
for(int i=0;i(listsLen-1);i++)
{
if(lists[i]!=NULL)
{
p0 = lists[i];
}
p1 = lists[i+1];
if(p1!=NULL && p0!=NULL)
{
while(p0-next!=NULL)
{
p0 = p0-next;
}
p0-next = p1;
}
}
phead = lists[0];
将链表中的元素排序,采用冒泡法
p0 = phead;
if(p0==NULL p0-next==NULL)
{
return p0;
}
while(p0-next!=NULL)
{
p0 = p0-next;
n++;
}
p0 = phead;
for(int i=0;in;i++)
{
p0 = phead;
p1 = p0;
for(int j=0;j(n-i);j++)
{
p2 = p1-next;
p3 = p2-next;
if(p2-val p1-val)
{
p2-next = p1;
p1-next = p3;
if(p1==phead)
{
phead = p2;
}
else
{
p0-next = p2;
}
p0 = p2;
}
else
{
p0 = p1;
}
p1 = p0-next;
}
}
return phead;
第二种:插入排序法,第一个链表和第二个链表,通过比较元素的大小完成合并,将这个大链表作为第一个,再往后寻找第二个链表,再进行合并,采取两两合并。
struct ListNode* p1;
struct ListNode* p2;
struct ListNode* p3;
struct ListNode* p4;
if(listsLen==0 || listsLen==1)
{
return lists[0];
}
p0 = lists[0];
p1 = NULL;
for(int i=0;i<(listsLen-1);i++)
{
if(p0 == NULL)
{
p0 = lists[i];
}
p1 = lists[i+1];
if(p0!=NULL && p1!=NULL)
{
if(p0->val > p1->val)
{
p2 =p0;
p0 = p1;
p1 = p2;
}
p2 = p0;
p3 = p1;
p4 = p2;
while(p2!=NULL && p3!=NULL)
{
if(p3->val < p2->val)
{
p1 = p1->next;
p4->next = p3;
p3->next = p2;
p4 = p3;
p3 = p1;
}
else
{
p4 = p2;
p2 = p2->next;
}
}
if(p4->next==NULL)
{
p4->next = p1;
}
}
}
return p0;
第三种:粗暴方法,将所有元素都提出来存到数组里,升序排列后,再生成新的链表
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*
* C语言声明定义全局变量请加上static,防止重复定义
*/
/**
*
* @param lists ListNode类一维数组
* @param listsLen int lists数组长度
* @return ListNode类
*/
int cmp ( const void *a , const void *b )
{
return *(int *)a - *(int *)b;
}
struct ListNode* mergeKLists(struct ListNode** lists, int listsLen ) {
// write code here
struct ListNode* result = malloc(sizeof(struct ListNode));
int list[100000];
int j=0;
struct ListNode* p0;
for(int i=0;i<listsLen;i++)
{
p0 = lists[i];
while(p0!=NULL)
{
list[j++]=p0->val;
p0 = p0->next;
}
}
qsort(list, j, sizeof(int), cmp);
p0 = result;
for(int i=0;i<j;i++)
{
struct ListNode* temp = malloc(sizeof(struct ListNode));
temp->val = list[i];
temp->next = NULL;
p0->next = temp;
p0 = p0->next;
}
return result->next;
}