LeetCode链表问题:非DOM环境下如何创建NodeList或转数组为NodeList?
合并两个有序链表的正确链表解法
看来你已经搞清楚这是个链表问题而非数组问题啦,这就找对方向了!LeetCode里的这类链表题目,输入的l1和l2都是数据结构中的链表节点对象,和DOM里的NodeList完全不是一回事,不需要操作DOM来创建。每个链表节点的结构通常是这样定义的:
function ListNode(val, next) { this.val = (val === undefined ? 0 : val); this.next = (next === undefined ? null : next); }
你之前的代码是针对数组处理的逻辑,所以返回了数组,但题目要求返回拼接原节点后的链表头节点,我们需要用链表的遍历方式来实现。
下面给你一个直观的迭代式解法,核心逻辑和你想的“合并有序序列”一致,但操作对象是链表节点:
function mergeTwoLists(l1, l2) { // 创建一个哑节点,用来简化链表头的处理(最后不会返回它) const dummy = new ListNode(0); let current = dummy; // 同时遍历两个有序链表 while (l1 !== null && l2 !== null) { if (l1.val <= l2.val) { current.next = l1; // 把较小的节点直接接在结果链表后 l1 = l1.next; // 移动l1的指针到下一个节点 } else { current.next = l2; l2 = l2.next; } current = current.next; // 移动结果链表的指针 } // 把剩下未遍历完的链表直接拼接上去 current.next = l1 !== null ? l1 : l2; // 返回合并后的链表头节点 return dummy.next; }
如何测试这个函数?
如果你想用数组来模拟输入输出,可以写两个辅助函数来转换:
// 把数组转换成链表 function arrayToList(arr) { const dummy = new ListNode(0); let current = dummy; for (const num of arr) { current.next = new ListNode(num); current = current.next; } return dummy.next; } // 把链表转换成数组,方便查看结果 function listToArray(list) { const arr = []; let current = list; while (current !== null) { arr.push(current.val); current = current.next; } return arr; } // 测试示例输入 const listOne = arrayToList([1,2,4]); const listTwo = arrayToList([1,3,4]); const mergedList = mergeTwoLists(listOne, listTwo); console.log(listToArray(mergedList)); // 输出 [1,1,2,3,4,4]
这个解法完全符合题目要求:直接拼接原链表的节点(除了用来简化逻辑的哑节点),时间复杂度为O(n+m),空间复杂度为O(1),是高效的标准解法。
内容的提问来源于stack exchange,提问作者Juan Luces
相关产品推荐
相关产品推荐

