題目連接:https://leetcode.com/problems/merge-intervals/description/java
題目大意:給出一串list,裏面裝interval類,這個類裏有start和end兩個屬性,表示起始點和結束點,若是前面interval的結束點>後面interval的起始點,則合併兩個interval,起始點是較小者,結束點是較大者。例子以下:ide
法一(借鑑):先排序後求解。這裏用到了java自定義類的排序 。只是排序時是按照start排序,而不是按照end排序,當start小的排在前面的時候,只須要比較end便可,不然按end排序的話,start小的若是在後面仍是會出現問題,而又不能只比較start,因此很容易漏測試用例。思想:按start升序排列,若是end<start,則直接add;不然,更改當前end爲max(當前end,新end)。代碼以下(耗時26ms):測試
1 //自定義排序,按照start升序 2 class sortStart implements Comparator<Interval> { 3 public int compare(Interval i1, Interval i2) { 4 return i1.start - i2.start; 5 } 6 } 7 public List<Interval> merge(List<Interval> intervals) { 8 Collections.sort(intervals, new sortStart()); 9 LinkedList<Interval> res = new LinkedList<Interval>(); 10 for(Interval interval : intervals) { 11 //若是未重疊,則直接add 12 if(res.isEmpty() || res.getLast().end < interval.start) { 13 res.add(interval); 14 } 15 //若是重疊,則更新end,由於已經按start排好序,因此只更新end便可,不用更新start 16 else { 17 res.getLast().end = Math.max(res.getLast().end, interval.end); 18 } 19 } 20 return res; 21 }