LinkedLIst Object 不被视为与 ListNode 属于同一类型,即使它具有相同的属性



我正在解决leetcode上的合并两个排序列表问题。我将两个列表中的值放入一个数组中,并对数组进行排序。当我尝试将数组转换回链表时出现问题。我正在尝试根据他们给我的定义重新创建链接列表对象。

function ListNode(val, next) {
this.val = (val===undefined ? 0 : val)
this.next = (next===undefined ? null : next)
}

我用new ListNode(val,next)将数组重新变成链表 这是代码:

head = new Object() //the value of head gets changed to a ListNode on the first index
for(let i = saved.length-1; i > -1 ;i--){
if(i ==saved.length-1){
head = new ListNode(saved[i],null);
}
else{
head = new ListNode(saved[i],head);
}
}
console.log(head);
return head;

头部显示为 [1,1,2,3,4,4] 和typeof head日志对象。

引发此错误:

throw new TypeError(__serialize__(ret) + " is not valid value for the expected return type ListNode");

据我所知,head 的返回值应该是一个 ListNode,因为它使用 ListNode 构造函数,并且它具有相同的 next 和 val 属性。 如何将我的输出识别为 ListNode 对象?

我尝试过的事情

- 使用那里的ListNode构造函数 -创建一个对象并添加属性 val 和 next。 -将第一个列表节点的最后一个节点与第二个列表节点的第一个节点分支并覆盖值。即:头=起始节点;head.val = saved[i];头 = 头.下一个;

saved是空数组时,将出现问题。我检查了 LeetCode 问题约束,输入确实可能是两个空列表,即您的数组将是空的。

在这种情况下,您的函数返回new Object(),这不是预期值。在这种情况下,函数应该返回null,它表示一个空的链表。

所以不要创建那个new Object(),而只是将head初始化为null。这带来了第二个优势:您不再需要if..else。最后,确保将head定义为局部变量(带let):

function makeList(saved) {
let head = null;
for (const value of saved.reverse()){
head = new ListNode(value, head);
}
saved.reverse() // Optionally restore the original order in the array
return head;
}

备注

这里还有另一个挑战:尝试在不分配内存来复制值(如数组)的情况下解决它,并且不创建新的ListNode实例。这些代码挑战旨在通过重新连接现有节点实例来解决。

最新更新