Skip to content

Commit d51a726

Browse files
committed
23.合并K个升序链表
1 parent c71eec7 commit d51a726

File tree

2 files changed

+88
-0
lines changed

2 files changed

+88
-0
lines changed

leetcode_Java/DoneTitle.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
20. 有效的括号
1111
21. 合并两个有序链表
1212
22. 括号生成
13+
23. 合并K个升序链表
1314
25. K 个一组翻转链表
1415
31. 下一个排列
1516
33. 搜索旋转排序数组

leetcode_Java/Solution0023.java

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
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

Comments
 (0)