- 整体的程序分为两步:两个链表之间的合并,以及对一组链表对折造成两两链表对
- Merge(struct ListNode* pHead1, struct ListNode* pHead2 ):将两个链表进行合并
- 将链表的数组进行对折,首尾进行一对链表的合并,进行迭代
// 合并两个链表
struct ListNode* Merge(struct ListNode* pHead1, struct ListNode* pHead2 ) {
// write code here
if(!pHead1)
return pHead2;
if(!pHead2)
return pHead1;
struct ListNode * ph1, * ph2,* p;
struct ListNode * newHd = (struct ListNode *)malloc(sizeof(struct ListNode));
p = newHd;
p->next = NULL;
ph1 = pHead1;
ph2 = pHead2;
while(ph1 && ph2)
{
if(ph1->val > ph2->val)
{
p->next = ph2;
p = ph2;
ph2 = ph2->next;
p->next = NULL;
}else
{
p->next = ph1;
p = ph1;
ph1 = ph1->next;
p->next = NULL;
}
}
if(!ph1)
p->next = ph2;
if(!ph2)
p->next = ph1;
return newHd->next;
}
struct ListNode* mergeKLists(struct ListNode** lists, int listsLen ) {
// write code here
int i = 0;
//int n = listsLen - 1;
while(listsLen / 2)
{
for(i = 0 ; i < listsLen / 2 ; i++)
{
lists[i] = Merge(lists[i],lists[listsLen - i - 1]);//listsLen长度随时变化,需要用listsLen标注
}
listsLen = (listsLen % 2)?(listsLen / 2 + 1):(listsLen / 2);
}
return lists[0];
}