LeetCode题号:21. 合并两个有序链表
问题描述:
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
解题思路:
1、递归解法:
如果 l1 或者 l2 一开始就是空链表 ,那么没有任何操作需要合并,所以我们只需要返回非空链表。否则,我们要判断 l1 和 l2 哪一个链表的头节点的值更小,然后递归地决定下一个添加到结果里的节点。如果两个链表有一个为空,递归结束。
2、遍历迭代:
定义一个prehead,只需要调整它的 next 指针。让它总是指向l1或者l2中较小的一个,直到l1或者l2任一指向null。这样到了最后,如果l1还是l2中任意一方还有余下元素没有用到,那余下的这些元素一定大于prehead已经合并完的链表(因为是有序链表)。
//递归
func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {
if l1==nil{
return l2
}
if l2==nil{
return l1
}
if l1.Val < l2.Val{
l1.Next = mergeTwoLists(l1.Next,l2)
return l1
}else{
l2.Next = mergeTwoLists(l1,l2.Next)
return l2
}
}
//迭代
func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {
res :=&ListNode{}
l3:=res
if l1==nil{
return l2
}
if l2==nil{
return l1
}
for l1!=nil && l2!=nil{
if l1.Val <=l2.Val{
l3.Next = l1
l1 = l1.Next
}else{
l3.Next = l2
l2 = l2.Next
}
l3=l3.Next
}
if l1 !=nil{
l3.Next = l1
}else{
l3.Next = l2
}
return res.Next
}
往期回顾:
【1】LeetCode-876. 链表的中间结点(Goland实现)
【2】LeetCode-剑指 Offer 22. 链表中倒数第k个节点(Goland实现)
❤如果文章对您有所帮助,就在文章的右上角或者文章的末尾点个赞吧!(づ ̄ 3 ̄)づ
❤如果喜欢大白兔分享的文章,就给大白兔点个关注吧!(๑′ᴗ‵๑)づ╭❤~
❤对文章有任何问题欢迎小伙伴们下方留言或者入群探讨【群号:708072830】
❤鉴于个人经验有限,所有观点及技术研点,如有异议,请直接回复讨论(请勿发表攻击言论)