我正在尝试对Linkedin List进行合并排序。其结果导致StackOverflowError错误。以下是我完成的实施。请告诉我要进行的更改。
public class Solution {
public ListNode sortList(ListNode A) {
if (A == null || A.next == null)
{
return A;
}
ListNode middle = getMiddle(A);
ListNode middleNext = middle.next;
middle.next = null;
ListNode left = sortList(A);
ListNode right = sortList(middleNext);
ListNode head = combine(left,right);
return head;
}
public ListNode combine(ListNode head,ListNode otherHead){
ListNode combineResult = null;
if(head==null)
return otherHead;
if(otherHead == null)
return head;
if(head.val<=otherHead.val){
combineResult = head;
combineResult.next = combine(head.next,otherHead);
} else {
combineResult = otherHead;
combineResult.next = combine(head,otherHead.next);
}
return combineResult;
}
public ListNode getMiddle(ListNode A){
ListNode fastPtr = A;
ListNode slowPtr = A;
while(fastPtr!=null && fastPtr.next!=null){
fastPtr = fastPtr.next.next;
slowPtr = slowPtr.next;
}
return slowPtr;
}
}
答案 0 :(得分:0)
您有此方法声明
public ListNode sortList(ListNode A) {
并且无需对A
进行任何更改,就可以像下面这样调用方法:
ListNode left = sortList(A);
由于没有结束符,因此具有无限递归性。 sortList
的输入应该是当前时间间隔的最左侧和最右侧的节点,并且由于有链接列表,因此该时间间隔中的项目数也不会作为参数受到影响,以避免必须计算它反复。现在,代替这个,您只有一个参数,名为ListNode
的{{1}}。仅仅定义一个间隔还不够。
合并排序的思想是将有序集合重复地分成两半,分割成相似但更容易的子问题,直到达到琐碎问题并解决琐碎的任务,然后这些琐碎任务的组合就变得更加容易。