Merge k Sorted Lists

Merge k Sorted Lists

Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.

 

解题思路:

目的要合并K个sorted Lists,程序建立在合并两个sorted lists。之后采用二分法对K个list进行合并。整个算法过程类似归并排序。

另外:如果直接逐条合并链表,会超时!!

Code:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
ListNode *mergeList(ListNode *l1,ListNode *l2)
{
	if(l1==NULL)
		return l2;
	if(l2==NULL)
		return l1;

	ListNode *head=NULL;
	ListNode *cur=NULL;
	ListNode *p=l1;
	ListNode *q=l2;

	while(p && q)
	{
		ListNode *node;
		if(p->val <q->val)
		{
			node=p;
			p=p->next;
		}
		else
		{
			node=q;
			q=q->next;
		}
		if(head==NULL)
			head=cur=node;
		else
		{
			cur->next=node;
			node->next=NULL;
			cur=node;
		}
	}
	if(p)
		cur->next=p;
	else if(q)
		cur->next=q;
	return head;
}

ListNode* helper(vector<ListNode *> &lists,int l,int r)
{
	if(l<r)
	{
		int m=(l+r)/2;
		return mergeList(helper(lists,l,m),helper(lists,m+1,r));
	}
	return lists.at(l);
}

ListNode *mergeKLists(vector<ListNode *> &lists)
{
	if(lists.size()==0)
		return NULL;
	return helper(lists,0,lists.size()-1);
}
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值