使用Java中的合并排序对链接列表进行排序

时间:2018-08-25 08:45:51

标签: java algorithm data-structures

我正在尝试对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;
    }
}

1 个答案:

答案 0 :(得分:0)

您有此方法声明

public ListNode sortList(ListNode A) {

并且无需对A进行任何更改,就可以像下面这样调用方法:

ListNode left = sortList(A);

由于没有结束符,因此具有无限递归性。 sortList的输入应该是当前时间间隔的最左侧和最右侧的节点,并且由于有链接列表,因此该时间间隔中的项目数也不会作为参数受到影响,以避免必须计算它反复。现在,代替这个,您只有一个参数,名为ListNode的{​​{1}}。仅仅定义一个间隔还不够。

合并排序的思想是将有序集合重复地分成两半,分割成相似但更容易的子问题,直到达到琐碎问题并解决琐碎的任务,然后这些琐碎任务的组合就变得更加容易。