繁体   English   中英

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

[英]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的输入应该是当前间隔的最左边和最右边的节点,并且由于有链接列表,因此间隔中的项目数也不会作为参数受到影响,从而避免了重复计算。 现在,除了这个,您还有一个参数,一个名为AListNode 仅定义一个间隔是不够的。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM