leetcode-23

120 阅读1分钟

题目描述:具体描述原题。简单来说就是将N个有序链表合并成为一个有序链表。

解题思路:最暴力的方法是遍历N个链表,每次合并两个链表。稍微思考一下发现该题很适合直接套用分治思想来解,为了节省空间,两两合并有序链表过程中可以采用递归。具体过程见代码注释。

具体代码:

func mergeKLists(lists []*ListNode) *ListNode { // 套用分治基础解题模型即可
    l := len(lists)
	if l == 0 { // 划分结束条件
		return nil
	}
	if l == 1 { // 划分结束条件
		return lists[0]
	}
	n := l / 2 // 划分空间,将问题分解为两个子问题
	left := mergeKLists(lists[:n]) // 递归解决第一个子问题
	right := mergeKLists(lists[n:]) // 递归解决第二个子问题
	return merge(left, right) // 将两个有序链表合并成为一个有序链表
}

func merge(l1, l2 *ListNode) *ListNode { // 合并两个有序链表,该方法可作为21题解题思路
        if l1 == nil { // 递归终止条件
		return l2
	}
	if l2 == nil { // 递归终止条件
		return l1
	}
	if l1.Val < l2.Val { // 合并升序链表,合并降序链表时只需改变判断条件
		l1.Next = merge(l1.Next, l2)
		return l1
	}
	l2.Next = merge(l1, l2.Next)
	return l2
}

补充说明:分治只是一种思路,该题存在多种解题思路,欢迎留言