23.H 合并 K 个升序链表

Problem: 23. 合并 K 个升序链表

思路

合并两个有序链表是很简单的,因此考虑分治法。先把K个链表分为两个部分,分别进行排序,最后再合并两个链表。

Code

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func mergeKLists(lists []*ListNode) *ListNode {
	if len(lists) == 0 {
		return nil
	} else if len(lists) == 1 {
		return lists[0]
	}

	mid := len(lists) / 2
	part1 := mergeKLists(lists[0:mid])
	part2 := mergeKLists(lists[mid:])
	return mergeTwoLists(part1, part2)
}

func mergeTwoLists(head1 *ListNode, head2 *ListNode) *ListNode {
	dummyHead := &ListNode{Val: -1}
	pre := dummyHead
	for head1 != nil && head2 != nil {
		if head1.Val < head2.Val {
			pre.Next = head1
			head1 = head1.Next
		} else {
			pre.Next = head2
			head2 = head2.Next
		}

		pre = pre.Next
	}

	if head1 != nil {
		pre.Next = head1
	} else {
		pre.Next = head2
	}

	return dummyHead.Next
}

Last updated

Was this helpful?