/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} list1
* @param {number} a
* @param {number} b
* @param {ListNode} list2
* @return {ListNode}
*/
var mergeInBetween = function(list1, a, b, list2) {
let start = null // 存储连接list2的起点,即a-1节点
let end = null // 存储list2终点的节点,即b+1节点
let prev = new ListNode(null, list1) // 创建一个虚拟节点,它连接着list1的起点
let node = list1 // 用node遍历list1链表,查找a和b节点
let index = 0 // 记录链表的索引
// 遍历list1,查找start和end
while (node) {
// 当index === a时,它的上一个节点prev就是a-1节点
if (index === a) {
start = prev
}
// 当index - 1 === b时,当前节点即为b+1节点
if (index - 1 === b) {
end = node
break
}
// 每次循环索引加1
index++
// 每次循环,prev和node都向前移动一位
prev = node
node = node.next
}
// 将start连接到list2的头节点
start.next = list2
// 不断循环查找到list2的尾节点
while (list2.next) {
list2 = list2.next
}
// 将list2的尾节点连接到end
list2.next = end
// 返回新链表
return list1
};
评论