Java OOP solution (5ms, faster than 90%)
I think it\'s self-self-explanatory.\n\n\nclass Solution {\n    static class Fraction {\n        private int d;\n        private int n;\n        \n        Fract
I think it\'s self-self-explanatory.\n\n```\nclass Solution {\n    static class Fraction {\n        private int d;\n        private int n;\n        \n        Fraction() {\n            d = 1;    \n        }\n        \n        Fraction(int n, int d) {\n            if ( d < 0) {\n                d = -d;\n                n = -n;\n            }\n            this.d = d;\n            this.n = n;\n        }\n        \n        private int gcd(int a, int b) {\n            if (b == 0) return a;\n            return gcd(b, a%b);\n        }\n        \n        public Fraction add(Fraction other) {\n            int d = this.d * other.d;\n            // TODO overflow?\n            int n = this.n * other.d + other.n * this.d;\n            int g = gcd(n, d);\n            n /= g;\n            d /= g;\n            return new Fraction(n, d);\n        }\n        \n        public static Fraction fromString(String s) {\n            String[] arr = s.split("/");\n            return new Fraction(Integer.valueOf(arr[0]), Integer.valueOf(arr[1]));\n        }\n        \n        @Override\n        public String toString() {\n            return n + "/" + d;\n        }\n    }\n    \n    public String fractionAddition(String expression) {\n        Fraction fraction = new Fraction();\n        List<String> list = new ArrayList<>();\n        \n        int prev = 0;\n        for (int i = 0; i <= expression.length(); i++) {\n            if (i == expression.length() \n                || i > 0 && ( expression.charAt(i) == \'+\' || expression.charAt(i) == \'-\')) {\n                list.add(expression.substring(prev, i));\n                prev = i;\n            }\n        }\n        \n        \n        for (String s : list) {\n            fraction = fraction.add(Fraction.fromString(s));\n        }\n        return fraction.toString();\n    }\n}\n```
[]