📜  编写java程序合并三个单链表元素 - Java(1)

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

编写Java程序合并三个单链表元素

在Java中,我们可以通过链表来存储一些元素。有时候,我们需要将多个链表合并成一个链表。本次介绍如何编写Java程序,实现合并三个单链表元素的功能。

实现思路

合并三个单链表可分为两个步骤:

  1. 遍历三个单链表,将元素添加到一个新链表中;
  2. 对新链表中的元素进行排序。

在实现过程中,我们首先需要定义一个单链表节点类,然后定义三个单链表,最后编写合并单链表的方法。

代码实现

以下是Java代码实现合并三个单链表元素的功能:

/**
 * 单链表节点类
 */
class ListNode {
    int val;
    ListNode next;

    ListNode(int val) {
        this.val = val;
    }
}

public class MergeLinkedLists {
    /**
     * 合并三个单链表
     */
    public static ListNode merge(ListNode l1, ListNode l2, ListNode l3) {
        ListNode p1 = l1;
        ListNode p2 = l2;
        ListNode p3 = l3;

        // 定义新链表的头节点和尾节点
        ListNode head = null;
        ListNode tail = null;

        while (p1 != null || p2 != null || p3 != null) {
            // 找到当前链表中最小的元素
            int minVal = Integer.MAX_VALUE;
            if (p1 != null) minVal = Math.min(minVal, p1.val);
            if (p2 != null) minVal = Math.min(minVal, p2.val);
            if (p3 != null) minVal = Math.min(minVal, p3.val);

            // 将最小元素添加到新链表中
            ListNode node = new ListNode(minVal);
            if (head == null) {
                head = node;
                tail = node;
            } else {
                tail.next = node;
                tail = node;
            }

            // 将此时最小元素所在的链表指针往后推一位
            if (p1 != null && p1.val == minVal) p1 = p1.next;
            if (p2 != null && p2.val == minVal) p2 = p2.next;
            if (p3 != null && p3.val == minVal) p3 = p3.next;
        }

        return head;
    }

    public static void main(String[] args) {
        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 result = merge(l1, l2, l3);

        while (result != null) {
            System.out.print(result.val + "->");
            result = result.next;
        }
        System.out.print("null");
    }
}

在上述代码中,我们定义了一个ListNode类作为单链表节点,然后定义了一个merge方法用于合并三个单链表。在此方法中,我们使用三个指针p1p2p3,分别指向三个链表的头节点。同时定义一个headtail变量,用于记录新链表的头节点和尾节点。

while循环中,我们遍历三个单链表,找到其中最小的元素,并将其添加到新链表中。最后,将存储最小元素的链表指针指向下一个节点即可。

最后,我们调用merge方法,将三个单链表合并成一个。然后遍历这个新链表并输出,即可得到最终结果。

Markdown返回代码片段
````java
/**
 * 单链表节点类
 */
class ListNode {
    int val;
    ListNode next;

    ListNode(int val) {
        this.val = val;
    }
}

public class MergeLinkedLists {
    /**
     * 合并三个单链表
     */
    public static ListNode merge(ListNode l1, ListNode l2, ListNode l3) {
        ListNode p1 = l1;
        ListNode p2 = l2;
        ListNode p3 = l3;

        // 定义新链表的头节点和尾节点
        ListNode head = null;
        ListNode tail = null;

        while (p1 != null || p2 != null || p3 != null) {
            // 找到当前链表中最小的元素
            int minVal = Integer.MAX_VALUE;
            if (p1 != null) minVal = Math.min(minVal, p1.val);
            if (p2 != null) minVal = Math.min(minVal, p2.val);
            if (p3 != null) minVal = Math.min(minVal, p3.val);

            // 将最小元素添加到新链表中
            ListNode node = new ListNode(minVal);
            if (head == null) {
                head = node;
                tail = node;
            } else {
                tail.next = node;
                tail = node;
            }

            // 将此时最小元素所在的链表指针往后推一位
            if (p1 != null && p1.val == minVal) p1 = p1.next;
            if (p2 != null && p2.val == minVal) p2 = p2.next;
            if (p3 != null && p3.val == minVal) p3 = p3.next;
        }

        return head;
    }

    public static void main(String[] args) {
        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 result = merge(l1, l2, l3);

        while (result != null) {
            System.out.print(result.val + "->");
            result = result.next;
        }
        System.out.print("null");
    }
}

以上是合并三个单链表元素的完整代码。