我在[这里]有这个问题:https://leetcode.com/problems/merge-two-sorted-lists/
这是我的代码:
function createColumnDefs = (lookup) => ([
{
field: 'projects',
headerName: 'Projects',
filter: 'agSetColumnFilter',
cellRenderer: 'ListRenderer',
cellRendererParams: {
accessor: 'name'
},
filterParams: {
values: _.get(lookup, 'projects', []).map(project => project.name),
debounceMs: 200
}
},
{
field: 'keyword',
headerName: 'Keyword',
filter: 'agTextColumnFilter',
sort: 'asc',
filterParams: {
debounceMs: 200
},
pinned: 'left',
minWidth: 250
}
]);
我希望它具有合并列表的正确输出。但是它返回一个空列表。有人可以告诉我我的代码有什么问题吗?
答案 0 :(得分:1)
您的基本想法是正确的,但是您的算法存在一些问题。
您做的时候两次移动头
// Set current pointer to l1
curr = l1;
// Now curr == l1, both l1 and curr are pointing to the same object,
// you are changing refence to the l1.next, so you have just missed l1 value
curr = curr.next;
// Change to one more element further, so in result your are moving twice
l1 = l1.next;
因此,您需要分配值,然后进一步移动
此外,您将获得一个设置为NULL
的列表指针,而另一个指针将剩下项,在这种情况下,只剩下一项。
考虑到这种情况,您需要添加其余项,具体取决于哪个指针将被设置为空l1
或l2
。列表中只有一个仍然具有项目,因为上一个while
循环会将另一个设置为null。
这是算法的修改版本。
public class Main {
public static void main(String[] args) {
// Init first list
ListNode firstList = new ListNode(new ListNode(new ListNode(null,4),2),1);
ListNode secondList =new ListNode(new ListNode(new ListNode(null,4),3),1);
ListNode mergedList = mergeTwoLists(firstList,secondList);
while(mergedList !=null) {
System.out.println(mergedList.val);
mergedList = mergedList.next;
}
}
public static class ListNode {
public ListNode next;
public int val;
public ListNode(ListNode next,int val) {
this.next = next;
this.val = val;
}
public ListNode() {
}
}
public static ListNode mergeTwoLists(ListNode l1, ListNode l2) {
//dummyhead doesn't store anything useful
ListNode dummyhead = new ListNode();
ListNode curr = dummyhead;
while(l1 != null && l2 != null) {
if(l1.val < l2.val) {
curr.next = l1;
curr = curr.next;
l1 = l1.next;
} else {
curr.next = l2;
curr = curr.next;
l2 = l2.next;
}
}
// Add remaining items from first list
while(l1 !=null) {
curr.next = l1;
curr = curr.next;
l1 = l1.next;
}
// Add remaining items from second list
while(l2 !=null) {
curr.next = l2;
curr = curr.next;
l2 = l2.next;
}
return dummyhead.next;
}
}
当然可以对其进行优化和重构,但是为了更好地理解,我如上所述对其进行了修改。
答案 1 :(得分:0)
ListNode curr = dummyhead.next;
这里的dummyhead.next为null,因为它未指向使curr也为null的对象。
curr = l1;
这样,指向null的curr现在指向l1。在这里哪里没有设置dummyhead.next。
所以您可以代替
ListNode curr = dummyhead;
while(l1 != null && l2 != null) {
if(l1.val < l2.val) {
//System.out.println("!!!");
curr.next = l1;
curr = curr .next;
l1 = l1.next;
答案 2 :(得分:0)
您声明一个名为curr的变量,并使用下一个dummyhead的值(为null)启动。然后,给它分配一个新值,但对虚拟头结构没有任何作用。显然结果将是一个空列表,因为您不对结构dummyhead进行任何操作。 您的任务(完全是一项学习任务)是保持与光标的初始结构接触。
通常有助于画一幅画,结构之间如何相互指向,以理清结果的样子。