2つのソート済み連結リストをマージするにはJavaでどうすればよいですか?

再帰的に2つのソート済みリンクリストをマージすることもできる。手順は次のとおりだ。

  1. どちらかのリンクリストが空の場合、もう一方のリンクリストをそのまま返します。
  2. 先頭に値が小さい方のノードをマージ後のリストの最初のノードにする。
  3. 小さな方のノードの next ポインタを、再帰呼び出しでマージした後の連結リストに向ける。
  4. マージされた連結リストの頭のノードを返します。

Java コードの例を示します。

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

public class Solution {
    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;
        }
    }
}

使用例:

public class Main {
    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);
        
        // 合并两个有序链表
        Solution solution = new Solution();
        ListNode mergedList = solution.mergeTwoLists(l1, l2);
        
        // 打印合并后的链表
        while (mergedList != null) {
            System.out.print(mergedList.val + " ");
            mergedList = mergedList.next;
        }
    }
}

本質的に、これは他のアルゴリズムとまったく同じです。

1 1 2 3 4 4
bannerAds