LeetCode-- K 목록을 주문 통합

주제 :

  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      } 

추천

출처www.cnblogs.com/latup/p/11727404.html