Java 为什么';这个合并排序函数不会导致无限循环吗?

Java 为什么';这个合并排序函数不会导致无限循环吗?,java,sorting,merge,mergesort,Java,Sorting,Merge,Mergesort,我正在从事一个项目,该项目要求我在链表上实现合并排序,我正在使用本文中的代码来帮助我。有人能解释为什么在第6行,当我调用返回merge(merge_sort(head),merge_sort(sHalf))方法merge\u sort(head)在其内部,它包含相同的head指针不会导致无限循环?在我看来,一切都是从同一个指针开始的 public Node merge_sort(Node head) { if(head == null || head.next == null) { re

我正在从事一个项目,该项目要求我在链表上实现合并排序,我正在使用本文中的代码来帮助我。有人能解释为什么在第6行,当我调用
返回merge(merge_sort(head),merge_sort(sHalf))
方法
merge\u sort(head)
在其内部,它包含相同的head指针不会导致无限循环?在我看来,一切都是从同一个指针开始的

public Node merge_sort(Node head) {
    if(head == null || head.next == null) { return head; }
    Node middle = getMiddle(head);      //get the middle of the list
    Node sHalf = middle.next; middle.next = null;   //split the list into two               halfs

    return merge(merge_sort(head),merge_sort(sHalf));  //recurse on that
}

//Merge subroutine to merge two sorted lists
public Node merge(Node a, Node b) {
    Node dummyHead, curr; dummyHead = new Node(); curr = dummyHead;
    while(a !=null && b!= null) {
        if(a.info <= b.info) { curr.next = a; a = a.next; }
        else { curr.next = b; b = b.next; }
        curr = curr.next;
    }
    curr.next = (a == null) ? b : a;
    return dummyHead.next;
}

//Finding the middle element of the list for splitting
public Node getMiddle(Node head) {
    if(head == null) { return head; }
    Node slow, fast; slow = fast = head;
    while(fast.next != null && fast.next.next != null) {
        slow = slow.next; fast = fast.next.next;
    }
    return slow;
}
公共节点合并\排序(节点头){
if(head==null | | head.next==null){return head;}
Node middle=getMiddle(head);//获取列表的中间位置
Node sHalf=middle.next;middle.next=null;//将列表分成两部分
返回merge(merge_-sort(head),merge_-sort(sHalf));//在此基础上递归
}
//合并子例程,用于合并两个已排序列表
公共节点合并(节点a、节点b){
节点dummyHead,curr;dummyHead=新节点();curr=dummyHead;
while(a!=null&&b!=null){

如果(a.info是因为前一行:

Node sHalf = middle.next; middle.next = null;
特别是
middle.next=null;
部分

请理解,即使头指针相同,我们使用
middle.next=null
将列表拆分为一半。因此,在下一个递归调用中,它仅是最初发送的链接列表的一半


在某一点上,它将达到
head.next==null
条件。

用于对链接列表进行排序的另一种自下而上的方法,比扫描列表来拆分链接列表更简单、更快。Wiki有一个类似于std::list::sort中使用的示例。它使用与代码中相同的合并函数。