【问题标题】:merge sort linked list using java使用java合并排序链表
【发布时间】:2016-05-22 11:43:53
【问题描述】:
private static void mergeSort(Node<Integer> head) {
    if (head==null || head.next == null) {
        return;
    }

    Node<Integer> temp1 = head;
    Node<Integer> temp2 = head;
    int count = 0;
    while (temp2 != null && temp2.next != null) {
        temp1 = temp1.next;
        temp2 = temp2.next.next;
        count++;
    }
    Node<Integer> list1 = head;
    Node<Integer> listTemp1 = list1;
    while (count > 0) {
        listTemp1 = listTemp1.next;
        count--;
    }
    Node<Integer> list2 = listTemp1.next;
    listTemp1.next = null;

    mergeSort(list1);
    mergeSort(list2);

    Node<Integer> finalHead = null;
    Node<Integer> finalTail = null;
    if (list1.data < list2.data) {
        finalHead = list1;
        list1 = list1.next;
    } else {
        finalHead = list2;
        list2 = list2.next;
    }
    finalTail = finalHead;

    while (list1 != null && list2 != null) {
        if (list1.data < list2.data) {
            finalTail.next = list1;
            finalTail = list1;
            list1 = list1.next;
        } else {
            finalTail.next = list2;
            finalTail = list2;
            list2 = list2.next;
        }
    }

    if (list1 == null) {
        finalTail.next = list2;
    } else if (list2 == null) {
        finalTail.next = list1;
    }

    return;

}

抛出堆栈溢出错误。请帮助我纠正我的解决方案 我首先将我的链表分成两半,然后递归发送它们 之后,我将我的两个排序链表组合起来。 当我递归调用我的第一个列表时显示错误

【问题讨论】:

  • 提示:不要在一种方法中做所有事情:将功能分成几个方法并单独测试每个方法。堆栈溢出错误很可能意味着:您的递归没有停止。

标签: java linked-list mergesort


【解决方案1】:

如果您有一个包含 2 个元素的列表,它预计会继续递归调用该方法:

   while (temp2 != null && temp2.next != null) {
        temp1 = temp1.next;
        temp2 = temp2.next.next;
        count++;
    }

count 将等于“1”

   Node<Integer> list1 = head;
    Node<Integer> listTemp1 = list1;
    while (count > 0) {
        listTemp1 = listTemp1.next;
        count--;
    }

listTemp1 将指向第二个节点

   Node<Integer> list2 = listTemp1.next;
    listTemp1.next = null;
    mergeSort(list1);
    mergeSort(list2);

所以从我所见 list1 将继续指向第一个节点,而 list2 将继续指向 null,请注意 listTemp1.nex = null 实际上什么也没做,因为它已经指向 null

你可以通过递减计数来解决这个简单的问题。

【讨论】:

  • 如果你仔细观察,我会将分割后的列表发送到递归调用,我无法返回 head,因为我的函数返回 void
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-03
  • 2020-05-24
  • 1970-01-01
  • 2016-03-30
相关资源
最近更新 更多