先把区间按区间的起始位置从小到大排序,然后从前往后看一遍,如果下一个区间的开始比前一个区间的末尾要小。那么这两个区间就可以合并。

#include<iostream>
#include<algorithm>

using namespace std;

const int MAXN = 1e5+10;
struct node{
    int s,e;
}Interval[MAXN];
bool visit[MAXN];
bool cmp(node a,node b)
{
    if(a.s==b.s)
    {
        return a. e< b.e;
    }
    return a.s < b.s;
}
int main()
{
    int a,b;
    char c;
    int cnt = 0;
    while(cin >> a >> c >> b)
    {
         Interval[cnt].s = a;
         Interval[cnt].e = b;
         visit[cnt]= true;
         cnt++;
    }
    sort(Interval,Interval+cnt,cmp);
    for(int i = 1 ; i < cnt ; i++)
    {
        if(Interval[i].s <= Interval[i-1].e)//合并两个区间
        {
            Interval[i].s = min(Interval[i-1].s,Interval[i].s);
            Interval[i].e = max(Interval[i-1].e,Interval[i].e);
            visit[i-1]=false;
        }
    }
    for(int i = 0 ; i < cnt ; i++)
    {
        if(visit[i])
        {
            cout<<Interval[i].s<<","<<Interval[i].e<<" ";
        }
    }

    return 0;
}