【发布时间】:2021-07-01 17:29:46
【问题描述】:
问题的问题是: 给定一个由 k 个链表组成的数组,每个链表按升序排序。 将所有链表合并为一个排序的链表并返回。 一个成功的输入和输出示例是:
Input: lists = [[1,4,5],[1,3,4],[2,6]]
Output: [1,1,2,3,4,4,5,6]
Explanation: The linked-lists are:
[
1->4->5,
1->3->4,
2->6
]
merging them into one sorted list:
1->1->2->3->4->4->5->6
我的代码的问题是它不适用于负值,但它适用于正值。 例如输入-> [[2],[1],[-1]] 输出->[1,2]
public class Solution {
public ListNode MergeKLists(ListNode[] lists) {
if (lists.Length == 0) return null;
var newlist = new ListNode();
var result = newlist;
for(int i=0; i<lists.Length; i++)
{
if(lists[i] !=null)
newlist = MergeTwoLists(lists[i], newlist);
}
return result.next;
}
private ListNode MergeTwoLists(ListNode l1, ListNode l2) {
if (l1 == null)
return l2;
if (l2 == null)
return l1;
if (l1.val <= l2.val)
{
l1.next = MergeTwoLists(l1.next, l2);
return l1;
}
else
{
l2.next = MergeTwoLists(l1, l2.next);
return l2;
}
}
}
【问题讨论】:
-
阅读this article 了解调试代码的技巧。
-
您的示例是否适用于
[[3], [2], [1]]?我怀疑它没有,所以专门查看负值会导致你走错路,因为可能存在更严重的错误。 -
提示:你的“基础”列表(即
newlist)从一个节点开始。该节点中的val是什么?将这些知识与一个完全不同的事实结合起来:当您在代码中对newlist进行操作时,您在方法中返回result.next,而不是newlist.next。关于这两个事实,请注意您从 非空列表开始您的算法。您似乎试图用第二个错误来抵消该错误,即返回result.next而不是newlist。这些错误结合起来产生您看到的结果。 -
@Code-Apprentice:您的示例可以正常工作。代码确实在负值方面被破坏了,这是代码中两个完全不同的错误的结果,它们部分地相互平衡以隐藏任何合并到结果中的负数。