e.g. [0, 1] [1, 4] [4, 5] [5, 8] [2, 6] [3, 10] -> [0, 1] [1, 10]
逻辑判断的是前开后开的,不过这个改起来很方便
没有在传入的链表里直接操作,新建了个链表。每加入一个线段,在新链表里面过一遍,判断要删掉和合并的部分。
java里面迭代的时候不能操作链表了,遍历完之后整体删除和插入,每次必插入一条。
打印了下每个循环的过程。
public class LineMerge {
public static void main(String[] args) {
Integer[] l1 = new Integer[]{0,1};
Integer[] l2 = new Integer[]{1,4};
Integer[] l3 = new Integer[]{4,5};
Integer[] l4 = new Integer[]{5,8};
Integer[] l5 = new Integer[]{2,6};
Integer[] l6 = new Integer[]{3,10};
List<Integer[]> list = new ArrayList<>();
list.add(l1);
list.add(l2);
list.add(l3);
list.add(l4);
list.add(l5);
list.add(l6);
lineMerge(list);
}
/**
*
* @param pointlists
* @return
*/
public static List<Integer[]> lineMerge(List<Integer[]> pointlists){
List<Integer[]> lineSplitPoints = new ArrayList<Integer[]>();
for(Integer[] line: pointlists){
int start = line[0];
int end = line[1];
//线段有交叠的部分 就需要删除 重新定义线段长度
//每次循环必然会重新插入数据
System.out.println("import1 = " + Arrays.deepToString(line));
Iterator<Integer[]> it = lineSplitPoints.iterator();
List<Integer[]> removelist = new ArrayList<Integer[]>();
while (it.hasNext()){
Integer[] cur = it.next();
if(line[0] < cur[1] && line[1] > cur[0]){
start = Math.min(start,cur[0]);
end = Math.max(end,cur[1]);
System.out.println("remove = " + Arrays.toString(cur));
//迭代器好像不能直接remove
removelist.add(cur);
//it.remove();
}
}
lineSplitPoints.removeAll(removelist);
lineSplitPoints.add(new Integer[]{start,end});
for(Integer[] i : lineSplitPoints){
System.out.print(Arrays.deepToString(i));
}
System.out.println();
}
return lineSplitPoints;
}
}