Решил задачу по своему, мое решение прошло проверку, но когда открыл правильно решение, то был очень сильно озадачен. Читая код правильного решения не могу построить логическую цепочку, почему в том или ином случае выставляется необходимый ТИП.
int oldFileLine = 0;
    int newFileLine = 0;

    while ((oldFileLine < oldFileLines.size()) && (newFileLine < newFileLines.size())) {

        if (oldFileLines.get(oldFileLine).equals(newFileLines.get(newFileLine))) {
            lines.add(new LineItem(Type.SAME, oldFileLines.get(oldFileLine)));
            oldFileLine++;
            newFileLine++;
        } else if ((newFileLine + 1 < newFileLines.size()) && oldFileLines.get(oldFileLine).equals(newFileLines.get(newFileLine + 1))) {
            lines.add(new LineItem(Type.ADDED, newFileLines.get(newFileLine)));
            newFileLine++;
        } else if ((oldFileLine + 1 < oldFileLines.size()) && oldFileLines.get(oldFileLine + 1).equals(newFileLines.get(newFileLine))) {
            lines.add(new LineItem(Type.REMOVED, oldFileLines.get(oldFileLine)));
            oldFileLine++;
        }
    }

    while (oldFileLine < (oldFileLines.size())) {
        lines.add(new LineItem(Type.REMOVED, oldFileLines.get(oldFileLine)));
        oldFileLine++;
    }
    while (newFileLine < (newFileLines.size())) {
        lines.add(new LineItem(Type.ADDED, newFileLines.get(newFileLine)));
        newFileLine++;
    }
}