题目描述
给定一个链表数组,每个链表都已经按升序排列。
请将所有链表合并到一个升序链表中,返回合并后的链表。
示例 1:
输入: lists = [[1,4,5],[1,3,4],[2,6]]
输出: [1,1,2,3,4,4,5,6]
解释: 链表数组如下:
[
1->4->5,
1->3->4,
2->6
]
将它们合并到一个有序链表中得到。
1->1->2->3->4->4->5->6
示例 2:
输入: lists = []
输出: []
示例 3:
输入: lists = [[]]
输出: []
提示:
k == lists.length
0 <= k <= 10^4
0 <= lists[i].length <= 500
-10^4 <= lists[i][j] <= 10^4
lists[i]
按 升序 排列
lists[i].length
的总和不超过 10^4
注意:本题与主站 23 题相同: https://leetcode.cn/problems/merge-k-sorted-lists/
解法
方法一
Python3 Java C++ Go JavaScript C# Ruby Swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 # Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution :
def mergeKLists ( self , lists : List [ ListNode ]) -> ListNode :
n = len ( lists )
if n == 0 :
return None
for i in range ( n - 1 ):
lists [ i + 1 ] = self . mergeTwoLists ( lists [ i ], lists [ i + 1 ])
return lists [ - 1 ]
def mergeTwoLists ( self , l1 : ListNode , l2 : ListNode ) -> ListNode :
dummy = ListNode ()
cur = dummy
while l1 and l2 :
if l1 . val <= l2 . val :
cur . next = l1
l1 = l1 . next
else :
cur . next = l2
l2 = l2 . next
cur = cur . next
cur . next = l1 or l2
return dummy . next
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 /**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode mergeKLists ( ListNode [] lists ) {
int n = lists . length ;
if ( n == 0 ) {
return null ;
}
for ( int i = 0 ; i < n - 1 ; ++ i ) {
lists [ i + 1 ] = mergeLists ( lists [ i ] , lists [ i + 1 ] );
}
return lists [ n - 1 ] ;
}
private ListNode mergeLists ( ListNode l1 , ListNode l2 ) {
ListNode dummy = new ListNode ();
ListNode cur = dummy ;
while ( l1 != null && l2 != null ) {
if ( l1 . val <= l2 . val ) {
cur . next = l1 ;
l1 = l1 . next ;
} else {
cur . next = l2 ;
l2 = l2 . next ;
}
cur = cur . next ;
}
cur . next = l1 == null ? l2 : l1 ;
return dummy . next ;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 /**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public :
ListNode * mergeKLists ( vector < ListNode *>& lists ) {
int n = lists . size ();
if ( n == 0 ) return nullptr ;
for ( int i = 1 ; i < n ; ++ i ) lists [ i ] = mergeTwoLists ( lists [ i - 1 ], lists [ i ]);
return lists [ n - 1 ];
}
private :
ListNode * mergeTwoLists ( ListNode * l1 , ListNode * l2 ) {
ListNode * dummy = new ListNode ();
ListNode * cur = dummy ;
while ( l1 && l2 ) {
if ( l1 -> val <= l2 -> val ) {
cur -> next = l1 ;
l1 = l1 -> next ;
} else {
cur -> next = l2 ;
l2 = l2 -> next ;
}
cur = cur -> next ;
}
cur -> next = l1 ? l1 : l2 ;
return dummy -> next ;
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 /**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func mergeKLists ( lists [] * ListNode ) * ListNode {
n := len ( lists )
if n == 0 {
return nil
}
for i := 1 ; i < n ; i ++ {
lists [ i ] = mergeTwoLists ( lists [ i - 1 ], lists [ i ])
}
return lists [ n - 1 ]
}
func mergeTwoLists ( l1 * ListNode , l2 * ListNode ) * ListNode {
dummy := & ListNode {}
cur := dummy
for l1 != nil && l2 != nil {
if l1 . Val <= l2 . Val {
cur . Next = l1
l1 = l1 . Next
} else {
cur . Next = l2
l2 = l2 . Next
}
cur = cur . Next
}
if l1 != nil {
cur . Next = l1
} else if l2 != nil {
cur . Next = l2
}
return dummy . Next
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 /**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode[]} lists
* @return {ListNode}
*/
var mergeKLists = function ( lists ) {
const n = lists . length ;
if ( n == 0 ) {
return null ;
}
for ( let i = 1 ; i < n ; ++ i ) {
lists [ i ] = mergeTwoLists ( lists [ i - 1 ], lists [ i ]);
}
return lists [ n - 1 ];
};
function mergeTwoLists ( l1 , l2 ) {
const dummy = new ListNode ();
let cur = dummy ;
while ( l1 && l2 ) {
if ( l1 . val <= l2 . val ) {
cur . next = l1 ;
l1 = l1 . next ;
} else {
cur . next = l2 ;
l2 = l2 . next ;
}
cur = cur . next ;
}
cur . next = l1 || l2 ;
return dummy . next ;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 /**
* Definition for singly-linked list.
* public class ListNode {
* public int val;
* public ListNode next;
* public ListNode(int val=0, ListNode next=null) {
* this.val = val;
* this.next = next;
* }
* }
*/
public class Solution {
public ListNode MergeKLists ( ListNode [] lists ) {
int n = lists . Length ;
if ( n == 0 ) {
return null ;
}
for ( int i = 1 ; i < n ; ++ i ) {
lists [ i ] = MergeTwoLists ( lists [ i - 1 ], lists [ i ]);
}
return lists [ n - 1 ];
}
private ListNode MergeTwoLists ( ListNode l1 , ListNode l2 ) {
ListNode dummy = new ListNode ();
ListNode cur = dummy ;
while ( l1 != null && l2 != null ) {
if ( l1 . val <= l2 . val ) {
cur . next = l1 ;
l1 = l1 . next ;
} else {
cur . next = l2 ;
l2 = l2 . next ;
}
cur = cur . next ;
}
cur . next = l1 == null ? l2 : l1 ;
return dummy . next ;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 # Definition for singly-linked list.
# class ListNode
# attr_accessor :val, :next
# def initialize(val = 0, _next = nil)
# @val = val
# @next = _next
# end
# end
# @param {ListNode[]} lists
# @return {ListNode}
def merge_k_lists ( lists )
n = lists . length
i = 1
while i < n
lists [ i ] = merge_two_lists ( lists [ i - 1 ] , lists [ i ] )
i += 1
end
lists [ n - 1 ]
end
def merge_two_lists ( l1 , l2 )
dummy = ListNode . new ()
cur = dummy
while l1 && l2
if l1 . val <= l2 . val
cur . next = l1
l1 = l1 . next
else
cur . next = l2
l2 = l2 . next
end
cur = cur . next
end
cur . next = l1 || l2
dummy . next
end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 /** class ListNode {
* var val: Int
* var next: ListNode?
* init() { self.val = 0; self.next = nil }
* init(_ val: Int) { self.val = val; self.next = nil }
* init(_ val: Int, _ next: ListNode?) { self.val = val; self.next = next }
* }
*/
class Solution {
func mergeKLists ( _ lists : [ ListNode ?]) -> ListNode ? {
let n = lists . count
if n == 0 {
return nil
}
var mergedList : ListNode ? = lists [ 0 ]
for i in 1. .< n {
mergedList = mergeLists ( mergedList , lists [ i ])
}
return mergedList
}
private func mergeLists ( _ l1 : ListNode ?, _ l2 : ListNode ?) -> ListNode ? {
let dummy = ListNode ()
var cur = dummy
var l1 = l1
var l2 = l2
while let node1 = l1 , let node2 = l2 {
if node1 . val <= node2 . val {
cur . next = node1
l1 = node1 . next
} else {
cur . next = node2
l2 = node2 . next
}
cur = cur . next !
}
cur . next = l1 ?? l2
return dummy . next
}
}
GitHub