注意:本篇撰写于2022-11-03,因个人博客迁移到掘金而发布时间变更。
一、算法思路
1.1 建模
这题非常简单,作为系列开篇。将两个有序单链表进行合并,本质思路是使用两个逐一偏移指针p1
、p2
对链表l1
、l2
进行元素比对,获取min(p1, p2)
元素拼接到新链表(结果链表)上。抽象来看,像拉拉链一样。l1、l2为拉链的左右链,拉取的过程是融合两者元素,形成拉完后的链条。
核心需要:
- 两个偏移指针,逐一遍历l1、l2
- 对链表结点数据域的比对方法
- 一条新的单链表,用于承载结果
1.2 注意事项
-
新创建的单链表可以使用「虚拟头结点」,也就是 chain 节点。利用虚拟头结点进行占位,可以避免空指针边界异常,降低代码的复杂性。
-
两条待处理的单链表长度是不一定相等的,需要考虑较长链表多出部分的结点处理。
二、核心代码
func mergeTwoLists(l1: SingleLinkList<Int>, l2: SingleLinkList<Int>) -> SingleLinkList<Int> {
let chain = SingleLinkList<Int>(head: SingleLinkNode(data: -1))
var p = chain.head!
var p1: SingleLinkNode? = l1.head
var p2: SingleLinkNode? = l2.head
while p1 != nil && p2 != nil {
if p1!.data < p2!.data {
p.next = p1
p1 = p1?.next
} else {
p.next = p2
p2 = p2?.next
}
if let next = p.next {
p = next
}
}
if (p1 != nil) {
p.next = p1
}
if (p2 != nil) {
p.next = p2
}
return chain
}
See the complete code for details: github.com/Smallfan/Sw…