C++ 合并环状链表

//合并环状链表
/给出一个链表数组,该链表数组均是某一个环状链表的一部分,请你将这些链表数组合并成环状链表,然后需要找到一个位置,使得从这个位置将环切开后,按照顺序或逆序遍历这个环,形成的链字典序尽量小,并返回这条链。
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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一步倾川

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值