021 合并两个有序链表-简单
题目:
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
分析:
算法1:利用哑结点
// date 2023/10/17
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func mergeTwoLists(list1 *ListNode, list2 *ListNode) *ListNode {
l1, l2 := list1, list2
dumy := &ListNode{}
pre := dumy
for l1 != nil && l2 != nil {
if l1.Val < l2.Val {
pre.Next = l1
l1 = l1.Next
} else {
pre.Next = l2
l2 = l2.Next
}
pre = pre.Next
}
if l1 != nil {
pre.Next = l1
}
if l2 != nil {
pre.Next = l2
}
return dumy.Next
}
算法2:递归版
每个节点只会访问一次,因此时间复杂度为O(n+m);只有到达l1或l2的底部,递归才会返回,所以空间复杂度为O(n+m)
// 递归版
func mergeTwoLists(l1, l2 *ListNode) *ListNode {
if l1 == nil {return l2}
if l2 == nil {return l1}
var newHead *ListNode
if l1.Val < l2.Val {
newHead = l1
newHead.Next = mergeTwoLists(l1.Next, l2)
} else {
newHead = l2
newHead.Next = mergeTwoLists(l1, l2.Next)
}
return newHead
}
最后更新于