Первый пример из задачи работает корректно. результат объединения: оригинальный редактированный общий file1: file2: результат:(lines) строка1 строка1 SAME строка1 строка2 REMOVED строка2 строка3 строка3 SAME строка3 строка4 REMOVED строка4 строка5 строка5 SAME строка5 строка0 ADDED строка0 строка1 строка1 SAME строка1 строка2 REMOVED строка2 строка3 строка3 SAME строка3 строка4 ADDED строка4 строка5 строка5 SAME строка5 строка0 REMOVED строка0 Второй пример не могу допилить. Два дня сижу уже. Пример 2: содержимое оригинального файла (file1): строка1 содержимое "редактированного" файла (file2): строка1 строка0 результат объединения: оригинальный редактированный общий file1: file2: результат:(lines) строка1 строка1 SAME строка1 строка0 ADDED строка0 Искал в сообществе, гуглил. Но уперся в тупик. Не понимаю почему мне выдает ошибку IndexOutOfBoundsException в строке 59.
public class Solution {
    public static List<LineItem> lines = new ArrayList<LineItem>();

    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String file1 = reader.readLine();
        String file2 = reader.readLine();
        reader.close();
        BufferedReader reader1 = new BufferedReader(new FileReader(file1));
        BufferedReader reader2 = new BufferedReader(new FileReader(file2));

        ArrayList<String> list = new ArrayList<>();
        ArrayList<String> list1 = new ArrayList<>();
        while (reader1.ready()) {
            list.add(reader1.readLine());
        }
        while (reader2.ready()) {
            list1.add(reader2.readLine());
        }
        list.forEach(System.out::println);
        list1.forEach(System.out::println);

        int min = Math.max(list.size(), list1.size());
        for (int i = 0; i < min; i++) {
            try {
                if (list.get(i).equals(list1.get(i))) {
                    lines.add(new LineItem(Type.SAME, list.get(i)));
                    list.remove(i);
                    list1.remove(i);
                    i--;
                } else if (!list1.get(i).equals(list.get(i + 1))) {
                    lines.add(new LineItem(Type.ADDED, list1.get(i)));
                    list1.remove(i);
                    i--;
                } else {
                    lines.add(new LineItem(Type.REMOVED, list.get(i)));
                    list.remove(i);
                    i--;
                }

            } catch (Exception e) {
                if (!list.isEmpty())
                    lines.add(new LineItem(Type.REMOVED, list.get(i)));
            }
            if (!list1.isEmpty()) {
                lines.add(new LineItem(Type.ADDED, list1.get(i)));
            }
        }
        for (LineItem line : lines) {
            System.out.println(line.line+line.type);
        }
    }


    public static enum Type {
        ADDED,        //добавлена новая строка
        REMOVED,      //удалена строка
        SAME          //без изменений
    }

    public static class LineItem {
        public Type type;
        public String line;

        public LineItem(Type type, String line) {
            this.type = type;
            this.line = line;
        }
    }
}