算法探索_合并多个升序链表

问题描述:

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

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

示例 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 = [[]]
输出:[]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-k-sorted-lists

解决思路:

1.新建三个链表,一个负责保存头部最后返回,一个负责往后移动,搜罗数据,一个负责装填临时最小值。

2.遍历集合中链表所有元素,谁小谁装入结果中,然后改元素后移,结果指针后移

3.最后只剩一个链表不为空时,直接接到结果尾部然后返回

    /*
     *作者:赵星海
     *时间:2020/9/1 10:17
     *用途:合并K个升序链表
     */
    ListNode resultHead = null;//结果头
    ListNode result = null;//结果
    ListNode temporary = null;//临时最小值

    public ListNode mergeKLists(ListNode[] lists) {
        int min = 0;
        int count = 0;//不为空的数量
        temporary = null;
        for (int i = 0; i < lists.length; i++) {
            if (lists[i] != null) {
                count++;
                if (temporary == null || lists[i].val <= temporary.val) {
                    min = i;
                    temporary = lists[min];
                }
            }
        }
        if (temporary != null) {
            if (resultHead == null) {
                result = temporary;
                resultHead = result;
            } else {
                result.next = temporary;
                result = result.next;//结果头后移
            }
            lists[min] = lists[min].next;//添加到里面的数后移
            //list不为空 且 剩余孩子数量不为1 则 继续递归
            if (count != 1) {
                mergeKLists(lists);
            }
        }
        return resultHead;
    }

猜你喜欢

转载自blog.csdn.net/qq_39731011/article/details/108337720