주제 :
K 병합 목록을 정렬, 정렬 된 연결리스트 병합 반환하고, 구현의 분석 시간과 공간의 복잡성.
내 생각은 정렬 할 목록에서 목록을 선택하기 위해 설정하는 것입니다 및 정렬 할 목록이없는 경우, 전체 합병 과정이 완료 분류 병합의 목록을 선정되었습니다
1 수입 하고있는 java.util. * ; 2 3 / ** 4 단독으로 링크 된 목록 * 정의. 5 * 공용 클래스 ListNode { 6 *의 INT의 발; 7 * ListNode 다음; 8 * ListNode INT (X) {X = 브로; } 9 *} 10 * / 11 공용 클래스 해결 { 12 공용 ListNode의 mergeKLists (ListNode []리스트) { 13 ListNode 헤드 = 새로운 ListNode (0 ); 14 의 경우 (리스트! = null의 && lists.length! = 0 ) 15 { 16 위해 ( int로 , I가 lists.length <; I = 0 I가 ++) // 리스트로부터 선택된 각각 정렬되는 목록과 목록이 목록 병합 head.next 정렬되었다 . 17 { 18은 head.next = mergeTwoLists (head.next 나열 [I]) . (19) } (20)이다 } 21는 창 ; head.next 22이다 } (23)이 24 일 공개 ListNode의 mergeTwoLists (ListNode L1, L2 ListNode) 25 { 26는 IF (L1 == 널 || == L2 널 (null) ) 27 { 28 리턴 (L1) == null이 ? L2 : L1; 29 } 30 ListNode 헤드 l1.val = <= l2.val? L1 : L2; 31 ListNode의 헤드는 Cur1 = == L1? L1 : L2; 32 ListNode의 cur2 = 헤드 == L1? L2 : L1; 33 ListNode는 미리 = 널을 ; 34 ListNode 다음 = 널 ; 35 동안 (는 Cur1! = null의 && cur2! = null의 ) 36 { 37 의 경우 (cur1.val <= cur2.val) 38 { 39 미리 = 는 Cur1; 40 는 Cur1 = cur1.next; 41 } 42 또 43 { 44 다음 = cur2.next; 45 pre.next = cur2; 46 cur2.next = 는 Cur1; (47) 미리 = cur2; 48 cur2 = 다음; 49 } 50 } 51 pre.next =는 Cur1 == 널 ? cur2 :는 Cur1; 52은 창 헤드; 53이다 } 54이다 }
//이 방법의 시간 복잡도 k는리스트의 요소의 수를 나타낸다 (k × n)이고, O이고, N은 정렬 될 노드의 수 전부를 나타내는
@ 공간 복잡성 O (1)
공식 설명은 나누기를 부여하고 비교 노드의 수를 줄일 수있는 방법을 정복하는 시간 복잡도가 O (Nlogk)로 감소, 당신은보기 클릭 https://leetcode-cn.com/problems/merge-k-sorted-lists을 / 용액 / 그는 빙 - KGE / -pai-쑤 리안 - 비아 오 바이 leetcode
1 수입 하고있는 java.util. * ; 2 3 / ** 4 단독으로 링크 된 목록 * 정의. 5 * 공용 클래스 ListNode { 6 *의 INT의 발; 7 * ListNode 다음; 8 * ListNode INT (X) {X = 브로; } 9 *} 10 * / 11 공용 클래스 해결 { 12 공용 ListNode의 mergeKLists (ListNode []리스트) { 13 일 경우 (목록 == 널 || lists.length == 0 ) 14 { 15 반환 널 ; 16 } 17 18 INT LEN = lists.length; 19 INT의 간격 = 1 ; 20 동안 (간격 < LEN) 21 { (22) 에 대해 ( int로 -; 간격 I <LEN 난 = 2 * + I = 0 간격) 23 { 24 목록은 [I]가 =의 mergeTwoLists은 (목록 [I], 목록은 [I 간격 + ]); // 归并的思想,两两合并 25 } 26 간격 * = 2 ; 27 } 28 개 반환 목록 [0 ]; 29 30 } 31 32 공중 ListNode의 mergeTwoLists (ListNode의 L1, L2의 ListNode) 33 { 34 의 경우 (L1 == 널 || L2 == 널 ) 35 { 36 반환 L1 == 널 ? L2 : L1; 37 } 38 ListNode 헤드 l1.val = <= l2.val? L1 : L2; 39 ListNode의 헤드는 Cur1 = == L1? L1 : L2; 40 ListNode의 cur2 = 헤드 == L1? L2 : L1; 41 ListNode는 미리 = 널을 ; 42 ListNode 다음 = 널 ; 43 동안 (!는 Cur1 = 널 ! && cur2 = 널 ) 44 { 45 의 경우 (cur1.val <= cur2.val) 46 { 47 미리 = 는 Cur1; 48 는 Cur1 = cur1.next; (49) } (50) 또 51 { 52 다음 = cur2.next; 53 pre.next = cur2; 54 cur2.next =는 Cur1; 55 예비가 = CUR2; 56이다 CUR2 = 다음, 57이다 } 58 } 59 pre.next =는 Cur1 == 널 ? CUR2 :는 Cur1; 60 리턴 헤드; 61이다 } (62)는이 }
// 겹치기 좋은 실현가 에서 https://leetcode-cn.com/problems/merge-k-sorted-lists/solution/leetcode-23-he-bing-kge-pai-xu-lian-biao-by-powcai/
1 공용 ListNode의 mergeKLists (ListNode []리스트) { 2 경우 (목록 == 널 || lists.length == 0 ) 3- { 4- 리턴 널 ; 5 } 6 복귀 병합 (목록 0 lists.length - 1 ); 7 } 8 9 공용 ListNode 병합 (ListNode []리스트가 되는 int 왼쪽 int로 우측) 10 { 11 일 경우 (왼쪽 == 오른쪽) 복귀 리스트 [좌측]; 12 INT 중간 = (좌측 + 우측) / 2; 13 ListNode L1 = 병합 (목록, 좌측 중간); 14 ListNode L2 = 병합 (목록, 중간 + 1 , 오른쪽); 15 리턴 mergeTwoLists (L1, L2); 16 }