内容简介:题干如下:将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例:
合并两个有序链表(Merge-Two-Sorted-Lists)
题干如下:
将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
来源:力扣
这个题目和 两数相加 相似,都是考察对链表的操作。其实具体实现方式也差不多啦。
解题思路
根据题干我们知道,给定的两个链表是有序的。假设 l1 指向其中一个链表的头部, l2 指向另一个链表的头部,并初始化 head 和 current ,使它们指向一个默认的节点。我们比较 l1 指向节点的值 V(l1) 与 l2 指向节点的值 V(l2) 的大小,如果 V(l1) 的值小于 V(l2) 的值,则使 current.next 指向 l1 这个节点, current 指向下一个节点, l1 指向 l1的下一个节点 ,反之,则使 current.next 指向 l2 这个节点, current 指向下一个节点, l2 指向 l2的下一个节点 。
具体流程图如下:
注: l1 和 l2 存在有一个指向 空 时的处理方案是:将 current.next 指向不是空的的链表即可,因为给定的两个链表本身是有序的。
代码实现
GO语言实现
func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {
var (
head = &ListNode{}
current = head
)
for true {
// l1 为空时,将 current.next 指向 l2 即可
if l1 == nil {
current.Next = l2
break
}
// l2 为空时,将 current.next 指向 l1 即可
if l2 == nil {
current.Next = l1
break
}
// 如果 l1的值 小于 l2的值 current.next指向l1,l1后移
if l1.Val < l2.Val {
current.Next = l1
l1 = l1.Next
} else {
// 如果 l2的值 小于等于 l1的值 current.next指向l2,l2后移
current.Next = l2
l2 = l2.Next
}
// current 后移一位
current = current.Next
}
// head 指向的是默认的节点,head.next 才是结果链表的头节点
return head.Next
}
总结
欢迎关注我们的微信公众号,每天学习 Go 知识
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- git 的合并原理(递归三路合并算法)
- 算法 - 合并若干有序文件
- Java中的合并排序算法
- 让我们一起啃算法----合并两个有序数组
- Hive集群合并之应用端的负载均衡算法
- LeetCode算法系列.0023_合并K个排序链表
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Pro Django
Marty Alchin / Apress / 2008-11-24 / USD 49.99
Django is the leading Python web application development framework. Learn how to leverage the Django web framework to its full potential in this advanced tutorial and reference. Endorsed by Django, Pr......一起来看看 《Pro Django》 这本书的介绍吧!