#include <stdio.h>
#include <stdlib.h>
// Define interval structure
typedef struct {
int start;
int end;
} Interval;
// Comparator for qsort to sort intervals by start time
int compare(const void *a, const void *b) {
Interval *i1 = (Interval *)a;
Interval *i2 = (Interval *)b;
return i1->start - i2->start;
}
// Function to merge overlapping intervals
// intervals: input array, n: number of intervals
// merged: output array to store merged intervals
// returns number of merged intervals
int mergeIntervals(Interval intervals[], int n, Interval merged[]) {
if (n == 0) return 0;
// Sort intervals by start time
qsort(intervals, n, sizeof(Interval), compare);
int idx = 0; // index for merged array
merged[0] = intervals[0]; // start with first interval
for (int i = 1; i < n; i++) {
// If current interval overlaps with last merged
if (intervals[i].start <= merged[idx].end) {
// Merge by extending the end if needed
if (intervals[i].end > merged[idx].end) {
merged[idx].end = intervals[i].end;
}
} else {
// No overlap, add new interval
idx++;
merged[idx] = intervals[i];
}
}
return idx + 1; // number of merged intervals
}
// Helper to print intervals
void printIntervals(Interval intervals[], int n) {
for (int i = 0; i < n; i++) {
printf("[%d,%d]", intervals[i].start, intervals[i].end);
if (i != n - 1) printf(" -> ");
}
printf(" -> null\n");
}
int main() {
Interval intervals[] = {{1,3}, {2,6}, {8,10}, {15,18}};
int n = sizeof(intervals) / sizeof(intervals[0]);
Interval merged[n];
int mergedCount = mergeIntervals(intervals, n, merged);
printf("Merged intervals:\n");
printIntervals(merged, mergedCount);
return 0;
}
qsort(intervals, n, sizeof(Interval), compare);
Sort intervals by start time to prepare for merging
merged[0] = intervals[0];
Initialize merged list with first interval
if (intervals[i].start <= merged[idx].end) {
Check if current interval overlaps with last merged interval
if (intervals[i].end > merged[idx].end) { merged[idx].end = intervals[i].end; }
Extend the end of merged interval if current interval ends later
else { idx++; merged[idx] = intervals[i]; }
No overlap, add current interval as new merged interval
Merged intervals:
[1,6] -> [8,10] -> [15,18] -> null