//合并环状链表
/给出一个链表数组,该链表数组均是某一个环状链表的一部分,请你将这些链表数组合并成环状链表,然后需要找到一个位置,使得从这个位置将环切开后,按照顺序或逆序遍历这个环,形成的链字典序尽量小,并返回这条链。
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;
}