📜  Java程序合并两个排序列表(就地)(1)

📅  最后修改于: 2023-12-03 14:43:03.374000             🧑  作者: Mango

Java程序合并两个排序列表(就地)

在Java中,我们可以通过链表来存储有序列表,并且可以通过“就地”方式来合并两个有序列表。这种方式可以节省空间,增加程序的效率。

算法思路
  1. 定义两个指针,分别指向要合并的两个有序列表的头结点。同时定义一个指向新链表的尾节点的指针,初始化为null。
  2. 比较两个指针所指节点的值,找到其中较小的值,将该节点加入到新链表中。如果某个链表指针到达末尾,直接将另一链表剩下的部分接入新链表的尾部。
  3. 重复步骤2直至某个链表没有剩余节点。
  4. 返回新链表的头结点。
代码实现

下面是一个Java程序的代码实现,其中mergeSortedLists为主函数,printList用来打印链表。

class ListNode {
    int val;
    ListNode next;

    ListNode(int x) {
        val = x;
    }
}

public class MergeSortedListsInPlace {

    public static void mergeSortedLists(ListNode l1, ListNode l2) {
        ListNode dummy = new ListNode(-1);
        ListNode tail = dummy;
        while (l1 != null && l2 != null) {
            if (l1.val < l2.val) {
                tail.next = l1;
                l1 = l1.next;
            } else {
                tail.next = l2;
                l2 = l2.next;
            }
            tail = tail.next;
        }
        if (l1 != null) {
            tail.next = l1;
        } else {
            tail.next = l2;
        }
        printList(dummy.next);
    }

    public static void printList(ListNode head) {
        ListNode cur = head;
        while (cur != null) {
            System.out.print(cur.val + " ");
            cur = cur.next;
        }
        System.out.println();
    }

    public static void main(String[] args) {
        ListNode l1 = new ListNode(1);
        l1.next = new ListNode(2);
        l1.next.next = new ListNode(4);
        ListNode l2 = new ListNode(1);
        l2.next = new ListNode(3);
        l2.next.next = new ListNode(4);
        mergeSortedLists(l1, l2);
    }
}

输出结果为:

1 1 2 3 4 4 
总结

就地合并两个有序链表是一种高效的方法,可以减少空间的使用。本文给出了该算法的具体实现,希望对大家有所帮助。