1

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
}

循环版本

循环的思路是,在 listAlistB 都不为空的情况下,先找到 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
}

参考资料

Codewars Kata
GitHub 的代码实现
GitHub 的测试


darkbaby123
1.4k 声望67 粉丝