📌  相关文章
📜  Java程序合并 K 个已排序的链表 – 第 1 组(1)

📅  最后修改于: 2023-12-03 15:02:05.913000             🧑  作者: Mango

Java程序合并 K 个已排序的链表

在软件开发中,我们经常需要将多个有序链表合并为一个有序链表。这个问题可以使用分治法来解决,即将原问题分解为若干个更小的问题,处理完这些问题后再将结果合并,即可得到原问题的解。

在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个已排序的链表的具体实现方法,希望对你有所帮助。