【Leetcode】23. 合并K个升序链表

75 阅读1分钟

题目描述

在这里插入图片描述

// 23. 合并K个升序链表

// 给你一个链表数组,每个链表都已经按升序排列。
// 请你将所有链表合并到一个升序链表中,返回合并后的链表。


题解

// 这个题是【Leetcode】21. 合并两个有序链表 的升级版嘛。
// 乍一看很吓人,实际上会写两链表合并的话,弄个for循环连续合并lists中的链表
// ,最终不就把多个链表合并了嘛。
// 构建两个有序链表合并函数mergeTwoList,写法同21题。
// 构建答案保存链表res初始化为null,for循环遍历lists中所有链表记为lists[i],
// 然后循环合并res和lists[i],将结果赋给res,最后返回res即可。
// 
// 执行用时:130 ms, 在所有 Java 提交中击败了17.33%的用户
// 内存消耗:40.1 MB, 在所有 Java 提交中击败了62.47%的用户
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
        ListNode res = null;
        for (int i = 0; i < lists.length; i++) {
            res = mergeTwoList(res, lists[i]);
        }
        return res;
    }

    private ListNode mergeTwoList(ListNode l1, ListNode l2) {
        if (l1 == null) 
            return l2;
        else if (l2 == null)
            return l1;
			
        ListNode temp = new ListNode(0);
        ListNode dummy;
        if (l1.val <= l2.val) dummy = l1;
        else dummy = l2;
		
        while (l1 != null && l2 != null) {
            if (l1.val <= l2.val) {
                while (l1.next != null && l1.next.val <= l2.val)
                    l1 = l1.next;
                temp = l1;
                l1 = l1.next;
                temp.next = l2;
            }
            else {
                while (l2.next != null && l1.val > l2.next.val)
                    l2 = l2.next;
                temp = l2;
                l2 = l2.next;
                temp.next = l1;
            }
        }
        return dummy;
    }
}