# 合并K个升序链表

<p>给你一个链表数组，每个链表都已经按升序排列。</p><p>请你将所有链表合并到一个升序链表中，返回合并后的链表。</p><p>&nbsp;</p><p><strong>示例 1：</strong></p><pre><strong>输入：</strong>lists = [[1,4,5],[1,3,4],[2,6]]<strong><br />输出：</strong>[1,1,2,3,4,4,5,6]<strong><br />解释：</strong>链表数组如下：[  1-&gt;4-&gt;5,  1-&gt;3-&gt;4,  2-&gt;6]将它们合并到一个有序链表中得到。1-&gt;1-&gt;2-&gt;3-&gt;4-&gt;4-&gt;5-&gt;6</pre><p><strong>示例 2：</strong></p><pre><strong>输入：</strong>lists = []<strong><br />输出：</strong>[]</pre><p><strong>示例 3：</strong></p><pre><strong>输入：</strong>lists = [[]]<strong><br />输出：</strong>[]</pre><p>&nbsp;</p><p><strong>提示：</strong></p><ul>	<li><code>k == lists.length</code></li>	<li><code>0 &lt;= k &lt;= 10^4</code></li>	<li><code>0 &lt;= lists[i].length &lt;= 500</code></li>	<li><code>-10^4 &lt;= lists[i][j] &lt;= 10^4</code></li>	<li><code>lists[i]</code> 按 <strong>升序</strong> 排列</li>	<li><code>lists[i].length</code> 的总和不超过 <code>10^4</code></li></ul>

以下程序实现了这一功能，请你填补空白处内容：

```java

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) {
		if (lists.length == 0)
			return null;

		return merge(lists, 0, lists.length - 1);
	}

	public ListNode merge(ListNode[] lists, int low, int high) {
		if (high - low == 0)
			return lists[low];
		else if (high - low == 1)
			return mergeTwoLists(lists[low], lists[high]);
		else {
			int mid = (low + high) / 2;
			_____________________________;
			return mergeTwoLists(tmp1, tmp2);
		}
	}

	public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
		ListNode head = new ListNode();
		ListNode p = head;
		while (l1 != null && l2 != null) {
			if (l1.val > l2.val) {
				p.next = l2;
				l2 = l2.next;
				p = p.next;
			} else {
				p.next = l1;
				l1 = l1.next;
				p = p.next;
			}
		}
		if (l1 != null)
			p.next = l1;
		if (l2 != null)
			p.next = l2;
		return head.next;
	}
}

```

## template

```java

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) {
		if (lists.length == 0)
			return null;

		return merge(lists, 0, lists.length - 1);
	}

	public ListNode merge(ListNode[] lists, int low, int high) {
		if (high - low == 0)
			return lists[low];
		else if (high - low == 1)
			return mergeTwoLists(lists[low], lists[high]);
		else {
			int mid = (low + high) / 2;
			ListNode tmp1 = merge(lists, low, mid);
			ListNode tmp2 = merge(lists, mid + 1, high);
			return mergeTwoLists(tmp1, tmp2);
		}
	}

	public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
		ListNode head = new ListNode();
		ListNode p = head;
		while (l1 != null && l2 != null) {
			if (l1.val > l2.val) {
				p.next = l2;
				l2 = l2.next;
				p = p.next;
			} else {
				p.next = l1;
				l1 = l1.next;
				p = p.next;
			}
		}
		if (l1 != null)
			p.next = l1;
		if (l2 != null)
			p.next = l2;
		return head.next;
	}
}

```

## 答案

```java
ListNode tmp1 = merge(lists, low, mid);
ListNode tmp2 = merge(lists, mid + 1, high);
```

## 选项

### A

```java
ListNode tmp1 = merge(lists, low, mid);
ListNode tmp2 = merge(lists, mid, high);
```

### B

```java
ListNode tmp1 = merge(lists, low, mid + 1);
ListNode tmp2 = merge(lists, mid + 1, high);
```

### C

```java
ListNode tmp1 = merge(lists, low, mid + 1);
ListNode tmp2 = merge(lists, mid - 1, high);
```