c语言编程笔录

首页 >   > 笔记大全

笔记大全

Java有序链表怎么合并

更新时间:2023-11-28
合并两个有序链表是一个经典的问题。当我们想要把两个有序链表合并成一个有序链表时,可以使用迭代或递归的方法。本文将使用Java语言解答这个问题。

方法一:迭代

首先,我们创建一个新的链表,用来保存合并后的结果。然后我们同时遍历两个链表,比较两个链表当前节点的值,将较小的值添加到新链表中,并将指针后移一位。重复这个过程直到其中一个链表为空。最后将非空链表的剩余部分直接添加到新链表的末尾。

下面是具体的代码实现:

public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
    // 创建一个新的链表,用来保存合并后的结果
    ListNode dummy = new ListNode(-1);
    ListNode curr = dummy;
    
    while (l1 != null && l2 != null) {
        if (l1.val <= l2.val) {
            curr.next = l1;
            l1 = l1.next;
        } else {
            curr.next = l2;
            l2 = l2.next;
        }
        curr = curr.next;
    }
    
    // 将非空链表的剩余部分直接添加到新链表的末尾
    curr.next = (l1 != null) ? l1 : l2;
    
    return dummy.next;
}

方法二:递归

使用递归的方法合并有序链表相对简洁一些。我们可以通过递归地合并链表的子链表,然后将较小的头节点添加到结果链表中。

下面是具体的代码实现:

public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
    if (l1 == null) {
        return l2;
    }
    if (l2 == null) {
        return l1;
    }
    
    if (l1.val <= l2.val) {
        l1.next = mergeTwoLists(l1.next, l2);
        return l1;
    } else {
        l2.next = mergeTwoLists(l1, l2.next);
        return l2;
    }
}

总结

以上就是使用Java语言合并有序链表的两种方法:迭代和递归。迭代的方法比较直观,通过比较当前节点的值来不断添加较小的节点到新链表中。递归的方法更为简洁,通过递归地合并链表的子链表和比较头节点的值来完成合并。选择哪种方法取决于个人的喜好和具体的应用场景。

无论使用哪种方法,合并两个有序链表的时间复杂度都是O(m+n),其中m和n分别是两个链表的长度。空间复杂度是O(m+n),需要额外的空间保存合并后的链表。