C++ 合并环状链表

C++ 合并环状链表,第1张

//合并环状链表
/给出一个链表数组,该链表数组均是某一个环状链表的一部分,请你将这些链表数组合并成环状链表,然后需要找到一个位置,使得从这个位置将环切开后,按照顺序或逆序遍历这个环,形成的链字典序尽量小,并返回这条链。
1.链表字典序的定义:对于两个链表a, b,从头节点到尾节点遍历,找到第一个不相同的节点值,如果存在i使得a[i].val 链表{ 1,2,3 } < 链表{ 1,2,4 }, 链表{ 3,4,5 } < 链表{ 6,7 }
2.环状链表不存在相同的节点值
3.该题环状链表节点个数最小为2
4.每个链表都是在环状链表上的顺时针的一部分
5.给定的链表数组一定能组成一个环状链表
/

ListNode* solve(vector<ListNode*>& a) {
	map<int, int>l, r;//当前的和下一个的
	int i, mi = 1e9;
	ListNode* p;
	for (int i = 0; i < a.size(); i++) {
		p = a[i];
		mi = min(mi, p->val);
		if (!p)continue;
		while (p->next) {
			r[p->val] = p->next->val;
			l[p->next->val] = p->val;
			p = p->next;
			mi = min(mi, p->val);
		}
	}
	ListNode* out = new ListNode(mi);
	p = out;
	if (l[mi] > r[mi]) {//判断顺时针还是逆时针的序小
		while (r[p->val] != mi) {
			p->next = new ListNode(r[p->val]);
			p = p->next;
		}
	}
	else {
		while (l[p->val] != mi) {
			p->next = new ListNode(l[p->val]);
			p = p->next;
		}
	}
	return out;
}

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/792223.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-05
下一篇2022-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存