题目链接:https://leetcode.com/problems/merge-k-sorted-lists/

题目:

Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.

思路:

注意要保存合并后新表头集合,合并迭代退出的条件是表头集合size为1。空间复杂度为O(n),时间复杂度为O(nlogn)。

设迭代合并链表次数为k,初始链表个数为n,则满足2^k=n,即k=log2(n)。因为每次合并两条链表时间复杂度为O(n),

所以整个算法时间复杂度为O(nlogn)。

算法:

public ListNode mergeKLists(ListNode[] lists) {
		if (lists.length == 0)
			return null;
		List<ListNode> heads = new ArrayList<ListNode>();// 存放每次合并后的新表头
		for (int i = 0; i < lists.length; i++) { //
			heads.add(lists[i]);
		}
		while (heads.size() > 1) {
			List<ListNode> head2 = new ArrayList<ListNode>();
			for (int i = 0; i + 1 < heads.size(); i += 2) {
				ListNode l1 = heads.get(i);
				ListNode l2 = heads.get(i + 1);
				head2.add(mergeTwoLists(l1, l2));// 合并后新表头集合
			}
			if (heads.size() % 2 == 1) { // 如果表头个数是奇数,要把最后一个表头加进来
				head2.add(heads.get(heads.size() - 1));
			}
			heads = new ArrayList<ListNode>(head2);
		}
		return heads.get(0);
	}

	public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
		ListNode head = null, l, p = l1, q = l2;
		// ==确定头节点
		if (p != null && q != null) {
			if (p.val < q.val) {
				head = p;
				p = p.next;
			} else {
				head = q;
				q = q.next;
			}
		} else if (p == null) {
			head = q;
			return head;
		} else if (q == null) {
			head = p;
			return head;
		}
		l = head;
		// ===end

		while (p != null && q != null) {
			if (p.val < q.val) {
				l.next = p;
				l = p;
				p = p.next;
			} else {
				l.next = q;
				l = q;
				q = q.next;
			}
		}

		if (p == null) {
			l.next = q;
		} else if (q == null) {
			l.next = p;
		}

		return head;
	}