原題鏈接:
https://leetcode.cn/problems/merge-in-between-linked-lists/
解題思路:
- 注意該題傳入的
a
和b
是鏈表的索引果复,而不是節(jié)點(diǎn)的值 - 先遍歷
list1
陈莽,找到a-1
和b+1
節(jié)點(diǎn) - 將
a-1
的next
指向list2
的頭節(jié)點(diǎn) - 在將
list2
的尾節(jié)點(diǎn)的next
指向b+1
節(jié)點(diǎn) - 返回
list1
,此時它為新鏈表
/**
* 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的起點(diǎn)虽抄,即a-1節(jié)點(diǎn)
let end = null // 存儲list2終點(diǎn)的節(jié)點(diǎn)走搁,即b+1節(jié)點(diǎn)
let prev = new ListNode(null, list1) // 創(chuàng)建一個虛擬節(jié)點(diǎn),它連接著list1的起點(diǎn)
let node = list1 // 用node遍歷list1鏈表迈窟,查找a和b節(jié)點(diǎn)
let index = 0 // 記錄鏈表的索引
// 遍歷list1私植,查找start和end
while (node) {
// 當(dāng)index === a時,它的上一個節(jié)點(diǎn)prev就是a-1節(jié)點(diǎn)
if (index === a) {
start = prev
}
// 當(dāng)index - 1 === b時菠隆,當(dāng)前節(jié)點(diǎn)即為b+1節(jié)點(diǎn)
if (index - 1 === b) {
end = node
break
}
// 每次循環(huán)索引加1
index++
// 每次循環(huán)兵琳,prev和node都向前移動一位
prev = node
node = node.next
}
// 將start連接到list2的頭節(jié)點(diǎn)
start.next = list2
// 不斷循環(huán)查找到list2的尾節(jié)點(diǎn)
while (list2.next) {
list2 = list2.next
}
// 將list2的尾節(jié)點(diǎn)連接到end
list2.next = end
// 返回新鏈表
return list1
};