BM5 合并k个已排序的链表
合并 k 个升序的链表并将结果作为一个升序的链表返回其头节点。
数据范围:节点总数 0≤n≤5000,每个节点的val满足 |val| <= 1000
要求:时间复杂度 O(nlogn)
解法
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/**
*
* @param lists ListNode类一维数组
* @param listsLen int lists数组长度
* @return ListNode类
*/
typedef struct ListNode* pnode;
static inline pnode Merge(struct ListNode* pHead1, struct ListNode* pHead2 ) {
// write code here
if(!pHead1)return pHead2;
if(!pHead2)return pHead1;
struct ListNode tmphead;
pnode p , q ,m;
p = pHead1;
q = pHead2;
m = &tmphead;
m->next = NULL;
while(q&&p)
{
if(p->val<=q->val)
{
m->next = p;
p=p->next;
//m = m->next;
}else{
m->next = q;
q=q->next;
//m = m->next;
}
m=m->next;
}
if(p)m->next = p;
else m->next = q;
return tmphead.next;
}
pnode mergeKlist(struct ListNode** lists, int left , int rig)
{
if(left == rig)return lists[left];
if(left > rig) return NULL;
if(left + 1 == rig) return Merge(lists[left],lists[rig]);
return Merge(mergeKlist(lists,left, (left+rig)/2), mergeKlist(lists, 1+(left+rig)/2,rig));
}
struct ListNode* mergeKLists(struct ListNode** lists, int listsLen ) {
// write code here
return mergeKlist(lists,0,listsLen-1);
}