📅  最后修改于: 2023-12-03 15:02:05.913000             🧑  作者: Mango
在软件开发中,我们经常需要将多个有序链表合并为一个有序链表。这个问题可以使用分治法来解决,即将原问题分解为若干个更小的问题,处理完这些问题后再将结果合并,即可得到原问题的解。
在Java中,我们可以使用递归的方式来实现链表的合并,具体操作如下:
首先我们定义一个ListNode类,用于表示单向链表的节点:
public class ListNode {
int val;
ListNode next;
public ListNode(int val) {
this.val = val;
this.next = null;
}
}
接下来,我们可以定义一个函数mergeKLists,用于合并K个有序链表。这个函数的实现可以使用分治法,即将原问题分解为两个更小的问题,分别处理这两个问题后再将结果合并即可。
具体操作如下:
public ListNode mergeKLists(ListNode[] lists) {
int len = lists.length;
if (len == 0) return null;
if (len == 1) return lists[0];
if (len == 2) return mergeTwoLists(lists[0], lists[1]);
int mid = len / 2;
ListNode[] leftLists = new ListNode[mid];
ListNode[] rightLists = new ListNode[len - mid];
for (int i = 0; i < mid; i++) {
leftLists[i] = lists[i];
}
for (int i = mid; i < len; i++) {
rightLists[i - mid] = lists[i];
}
ListNode left = mergeKLists(leftLists);
ListNode right = mergeKLists(rightLists);
return mergeTwoLists(left, right);
}
在这个函数中,我们首先判断传入的链表数组的长度,如果长度为0,则直接返回null。如果长度为1,则直接返回原始链表。如果长度为2,则调用mergeTwoLists函数合并这两个链表。
如果长度大于2,则拆分链表数组,将链表数组拆分为两个部分,分别合并这两个部分,最后再将结果合并即可。
最后,我们需要实现一个mergeTwoLists函数,用于合并两个有序链表。这个函数的实现可以使用迭代的方式,具体操作如下:
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode dummy = new ListNode(-1);
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;
}
if (l1 != null) {
cur.next = l1;
}
if (l2 != null) {
cur.next = l2;
}
return dummy.next;
}
在这个函数中,我们首先定义一个dummy节点和一个指针cur,遍历这两个链表,将它们的节点按升序的方式合并到一起。
最后,我们返回dummy节点的下一个节点即可。
用法示例:
ListNode l1 = new ListNode(1);
l1.next = new ListNode(4);
l1.next.next = new ListNode(5);
ListNode l2 = new ListNode(1);
l2.next = new ListNode(3);
l2.next.next = new ListNode(4);
ListNode l3 = new ListNode(2);
l3.next = new ListNode(6);
ListNode[] lists = { l1, l2, l3 };
ListNode result = mergeKLists(lists);
while (result != null) {
System.out.print(result.val + " ");
result = result.next;
}
输出结果:
1 1 2 3 4 4 5 6
以上就是Java程序合并K个已排序的链表的具体实现方法,希望对你有所帮助。