TL;DR
把一个链表衔接到另一个链表的末端。系列目次见 前言和目次 。
需求
完成一个 append()
函数,把两个链表衔接起来,并返回衔接后的链表头结点。
var listA = 1 -> 2 -> 3 -> null
var listB = 4 -> 5 -> 6 -> null
append(listA, listB) === 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> null
假如两个链表都是 null
就返回 null
,假如个中一个是 null
就返回另一个链表。
递归版本
append
自身就能够作为递归的逻辑。append(listA, listB)
实际上即是 listA.next = append(listA.next, listB)
,直到 listA
递归到末端 null
,这时候 append(null, listB)
直接返回 listB
即可。加上边界条件推断,代码以下:
function append(listA, listB) {
if (!listA) return listB
if (!listB) return listA
listA.next = append(listA.next, listB)
return listA
}
轮回版本
轮回的思绪是,在 listA
和 listB
都不为空的情况下,先找到 listA
的尾节点,假设为 node
,然后 node.next = listB
即可。代码以下:
function appendV2(listA, listB) {
if (!listA) return listB
if (!listB) return listA
let node = listA
while (node.next) node = node.next
node.next = listB
return listA
}