[英]Sort Link List using Merge Sort in Java
我正在尝试对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;
}
}
您有此方法声明
public ListNode sortList(ListNode A) {
并且不对A
进行任何更改,就可以像下面这样调用方法:
ListNode left = sortList(A);
由于没有结束符,因此具有无限递归性。 sortList
的输入应该是当前间隔的最左边和最右边的节点,并且由于有链接列表,因此间隔中的项目数也不会作为参数受到影响,从而避免了重复计算。 现在,除了这个,您还有一个参数,一个名为A
的ListNode
。 仅定义一个间隔是不够的。
合并排序的思想是将有序集合重复地分成两半,划分为相似但更容易的子问题,直到达到琐碎问题并解决琐碎的任务,然后这些琐碎任务的组合就变得更加容易。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.