leetcode facebook 面试题 Merge two interval lists

题意:

Given A and B two ascending sorted interval lists, A has no overlap inside A and B has no overlap inside B. Write the function to merge two interval lists, output the result with no overlap. Ask for a very efficient solution

A naive method can combine the two list, and sort and apply merge interval in the leetcode, but is not efficient enough.

For example,
A: [1,5], [10,14], [16,18]
B: [2,6], [8,10], [11,20]

output [1,6], [8, 20]

主要思路:双指针

代码:

typedef vector<pair<int, int>> Type;
int get_end_of_interval(int&, int&, Type&, Type&);
Type merge(Type& vec1, Type& vec2) {
	Type ret;
	int index1 = 0, index2 = 0;
	while (index1 < vec1.size() && index2 < vec2.size()) {
		int start, end;
		if (vec1[index1].first < vec2[index2].first) {
			start = vec1[index1].first;
			end = get_end_of_interval(index1, index2, vec1, vec2);
		}
		else {
			start = vec2[index2].first;
			end = get_end_of_interval(index2, index1, vec2, vec1);
		}
		ret.push_back(make_pair(start, end));
	}

	while (index1 < vec1.size())
		ret.push_back(vec1[index1++]);
	while (index2 < vec2.size())
		ret.push_back(vec2[index2++]);

	return ret;
}

int get_end_of_interval(int& index1, int& index2, Type& vec1, Type& vec2) {
	if (vec1[index1].second < vec2[index2].first)
		return vec1[index1++].second;
	else if (vec1[index1].second >= vec2[index2].second) {
		if (++index2 == vec2.size())
			return vec1[index1++].second;
		else
			return get_end_of_interval(index1, index2, vec1, vec2); // 递归是关键
	}
	else {
		if (++index1 == vec1.size())
			return vec2[index2++].second;
		else
			return  get_end_of_interval(index2, index1, vec2, vec1); // 这个递归是关键
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值