LeetCode 第23题 合并K个升序链表(附java和python代码)

给你一个链表数组,每个链表都已经按升序排列。

请你将所有链表合并到一个升序链表中,返回合并后的链表。

示例 1:

输入:lists = [[1,4,5],[1,3,4],[2,6]]
输出:[1,1,2,3,4,4,5,6]
解释:链表数组如下:
[
  1->4->5,
  1->3->4,
  2->6
]
将它们合并到一个有序链表中得到。
1->1->2->3->4->4->5->6

示例 2:

输入:lists = []
输出:[]

示例 3:

输入:lists = [[]]
输出:[]

提示:

k == lists.length
0 <= k <= 10^4
0 <= lists[i].length <= 500
-10^4 <= lists[i][j] <= 10^4
lists[i] 按 升序 排列
lists[i].length 的总和不超过 10^4

解题思路:

本问题是LeetCode 第21题目 合并两个有序链表(附java和python代码)的升级版本,主要是要维护一个列表的有序链表。

1、变量含义

准备一个boolean类型的变量flg,含义是是否所有的链表都已经走到了尾部节点,只要有一个不是空,则flg=True

2、只要flg==True:

       我们从所有链表但当前位置选择最小的节点加入到我们维护的结果链表中,当前链表后移一个。如果所有链表都走到末尾,则结束这个过程。

/**
 * 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) {
        boolean[] isEmpty = new boolean[lists.length];
        boolean flg = false;
        int n = lists.length;
        for(int i=0; i<n; i++){
            if(lists[i]!=null){
                flg = true;
            }
        }
        ListNode head = null;
        ListNode cur = null;
        int index = -1;
        int min_val = Integer.MAX_VALUE;
        while(flg){
            index = -1;
            min_val = Integer.MAX_VALUE;
            for(int i = 0; i< n; i++){
                if(lists[i]!=null){
                    if(lists[i].val<min_val){
                        min_val = Math.min(min_val, lists[i].val);
                        index = i;
                    }
                }
            }
            if(head==null){
                head = lists[index];
                cur = head;
            }else{
                cur.next = lists[index];
                cur = cur.next;
            }
            lists[index] = lists[index].next;
            flg = false;
            for(int i=0; i<n; i++){
                if(lists[i]!=null){
                    flg = true;
                }
            }
        }
        return head;
    }
}

Python代码

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution(object):
    def mergeKLists(self, lists):
        """
        :type lists: List[ListNode]
        :rtype: ListNode
        """
        isEmpty = [False for _ in range(len(lists))]
        flg = False
        n = len(lists)
        for i in range(n):
            if lists[i] is not None:
                flg = True
                break
        head = None
        cur = None
        index = -1
        min_val = 1<<31
        while flg:
            min_val = 1<<31
            index = -1
            for i in range(n):
                if lists[i] is not None:
                    if lists[i].val < min_val:
                        min_val = lists[i].val
                        index = i
            if head is None:
                head = lists[index]
                cur = head
            else:
                cur.next = lists[index]
                cur = cur.next
            lists[index] = lists[index].next
            flg = False
            for i in range(n):
                if lists[i] is not None:
                    flg = True
                    break
        return head

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值