White's Studio.

Leetcode-23.合并k个排序链表

2018/09/17 Share

Leetcode-23.合并k个排序链表

题目:

合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。

示例:

1
2
3
4
5
6
7
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6

之前还遇到过一题:

合并两个排序链表,返回合并后的排序链表。

将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例:

1
2
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

先做合并两个链表的

思路:

  1. 同时遍历两个链表,比较小的先记下来到新的链表上,被记录下来的链表指针后移。
  2. 其中一个链表指针为空时,另一链表就是新链表的后一位指向。
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
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode mergerTwoList (ListNode l1, ListNode l2) {
ListNode p = new ListNode(0);
ListNode dummy = p;

while (l1 != null && l2 != null) {
if (l1.val < l2.val) {
p.next = l1;
l1 = l1.next;
} else {
p.next = l2;
l2 = l2.next;
}
p = p.next;
}

if (l1 == null) p.next = l2;
if (l2 == null) p.next = l1;

return dummy.next;
}
}

合并k 个数组也根据以上思路就可以了。

只是要判断数组的各种情况

1)如果是数组里面只有两个 ListNode, 那跟上诉题目一样

2)如果数组大于两个 ListNode, 不断平分数组,把它变成状况(1)

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

class Solution {
public ListNode mergeKLists (ListNode[] lists) {
return divide(lists, 0, lists.length-1);
}

public ListNode divide (listNode[] list, int start, int end) {
if (end == start)
return list[start];
if (end < start)
return null;
if (end - start == 1) {
return mergerTwoList (list[start], list[end]);
}

int mid = start + ((end - start) >> 1);
ListNode left = divide(list, start, mid -1);
ListNode right = divide(list, mid, end);
return mergeTwoList(left, right);
}

public ListNode mergerTwoList (ListNode l1, ListNode l2) {
ListNode p = new ListNode(0);
ListNode dummy = p;

while (l1 != null && l2 != null) {
if (l1.val < l2.val) {
p.next = l1;
l1 = l1.next;
} else {
p.next = l2;
l2 = l2.next;
}
p = p.next;
}

if (l1 == null) p.next = l2;
if (l2 == null) p.next = l1;

return dummy.next;
}
}

end~

CATALOG
  1. 1. Leetcode-23.合并k个排序链表
    1. 1.1. 题目: