1
+ // 23. 合并K个升序链表
2
+
3
+
4
+ /**
5
+ * Definition for singly-linked list.
6
+ * public class ListNode {
7
+ * int val;
8
+ * ListNode next;
9
+ * ListNode() {}
10
+ * ListNode(int val) { this.val = val; }
11
+ * ListNode(int val, ListNode next) { this.val = val; this.next = next; }
12
+ * }
13
+ */
14
+
15
+
16
+ /*
17
+ 顺序合并:遍历链表数组,逐个链表进行合并
18
+ */
19
+ class Solution {
20
+ public ListNode mergeKLists (ListNode [] lists ) {
21
+ ListNode root = null ;
22
+ for (ListNode head : lists ) {
23
+ root = mergeTwoLists (root , head );
24
+ }
25
+ return root ;
26
+ }
27
+
28
+ // 21.合并两个有序链表
29
+ private ListNode mergeTwoLists (ListNode list1 , ListNode list2 ) {
30
+ ListNode head = new ListNode (-1 );
31
+ ListNode pre = head ;
32
+ while (list1 != null && list2 != null ) {
33
+ if (list1 .val < list2 .val ) {
34
+ pre .next = list1 ;
35
+ list1 = list1 .next ;
36
+ } else {
37
+ pre .next = list2 ;
38
+ list2 = list2 .next ;
39
+ }
40
+ pre = pre .next ;
41
+ }
42
+ pre .next = list1 == null ? list2 : list1 ;
43
+ return head .next ;
44
+ }
45
+ }
46
+
47
+
48
+ /*
49
+ 分治合并:
50
+ 1、终止条件:左右边界相同则返回对应链表,左边界大于右边界则返回空
51
+ 2、方法功能:入参链表数组、左边界、右边界,将链表数组拆分成两个链表,合并链表返回
52
+ 3、递归逻辑:数组拆分后,左右两部分数组仍然需要继续拆分,直到获得两个链表进行合并,因此调用同个方法进行处理,合并后的链表返回给上一层继续合并
53
+ */
54
+ class Solution {
55
+ public ListNode mergeKLists (ListNode [] lists ) {
56
+ return merge (lists , 0 , lists .length - 1 );
57
+ }
58
+
59
+ private ListNode merge (ListNode [] lists , int left , int right ) {
60
+ if (left == right ) {
61
+ return lists [left ];
62
+ }
63
+ if (left > right ) {
64
+ return null ;
65
+ }
66
+ int mid = (left + right ) / 2 ;
67
+ return mergeTwoLists (merge (lists , left , mid ), merge (lists , mid + 1 , right ));
68
+ }
69
+
70
+ // 21.合并两个有序链表
71
+ private ListNode mergeTwoLists (ListNode list1 , ListNode list2 ) {
72
+ ListNode head = new ListNode (-1 );
73
+ ListNode pre = head ;
74
+ while (list1 != null && list2 != null ) {
75
+ if (list1 .val < list2 .val ) {
76
+ pre .next = list1 ;
77
+ list1 = list1 .next ;
78
+ } else {
79
+ pre .next = list2 ;
80
+ list2 = list2 .next ;
81
+ }
82
+ pre = pre .next ;
83
+ }
84
+ pre .next = list1 == null ? list2 : list1 ;
85
+ return head .next ;
86
+ }
87
+ }
0 commit comments