目录
题目
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-two-sorted-lists
实现
方式1:迭代
type ListNode struct {
Data int
Next *ListNode
}
func merge2List(list1 *ListNode, list2 *ListNode) *ListNode {
node1,node2 := list1,list2
res := new(ListNode) // 用于返回合并后的链表
current := res
for node1 != nil && node2 != nil {
//node1当前节点的值<=node2时把node1接在 current的后面并将node1指针往后移,node2类似
if node1.Data < node2.Data {
current.Next = node1
node1 = node1.Next
} else {
current.Next = node2
node2 = node2.Next
}
current = current.Next
}
//某一个为空时,直接把另一个链表续在已经合并了的链表之后
if node1 == nil {
current.Next = node2
}
if node2 == nil {
current.Next = node1
}
return res.Next
}
时间复杂度:设两个链表长度分别是m和n,循环次数最多是m+n次,O(m+n)
方式2:递归
func merge2List2(list1 *ListNode, list2 *ListNode) *ListNode {
// 两个链表任一为空时递归结束
if list1 == nil {
return list2
}
if list2 == nil {
return list1
}
//每次递归都会去掉两链表之一的头节点
if list1.Data < list2.Data {
list1.Next = merge2List2(list1.Next, list2)
return list1
}else {
list2.Next = merge2List2(list1, list2.Next)
return list2
}
}
时间复杂度:O(m+n)
空间复杂度:每次递归调用函数需要消耗一定栈空间,迭代时只需固定常数级别的空间存放变量,从空间消耗来讲推荐迭代法。