今日のNiuKe ==単一リンクリストの選択ソート= Javaマージとクイックソート

タイトルの説明:順序付けされていない単一リンクリストが与えられた場合、単一リンクリストの並べ替え(昇順で並べ替え)を実現します。
入力[1,3,2,4,5]
戻り値{1,2,3,4,5}

マージして並べ替え(テンプレートと同じように):

import java.util.*;

/*
 * public class ListNode {
    
    
 *   int val;
 *   ListNode next = null;
 * }
 */

public class Solution {
    
      
    public ListNode sortInList(ListNode head) {
    
    
        if(null ==head|| head.next == null)return head;
        return mergesort(head);
    }
    public ListNode mergesort(ListNode head){
    
    
        if(null==head || head.next == null) return head;
        ListNode mid = findmid(head);
        ListNode l1 = mergesort(head);
        ListNode l2 = mergesort(mid);
        return merge(l1, l2);
         
    }
     
    public ListNode findmid(ListNode head){
    
    
        if(null==head || head.next == null) return head; 

        ListNode fast = head.next, slow = head;
        while(fast != null && fast.next != null){
    
    
            fast = fast.next.next;
            slow = slow.next;  
        }
        ListNode ret = slow.next;
        slow.next = null;
        return ret;
    }
    
    public ListNode merge(ListNode l1, ListNode l2){
    
     
        ListNode dummy = new ListNode(-1);
        ListNode ret = dummy;
        while(l1 != null && l2 != null){
    
    
            if(l1.val < l2.val){
    
     
                dummy.next = l1;
                dummy = dummy.next;
                l1 = l1.next;
            }else{
    
     
                dummy.next = l2;
                dummy = dummy.next;
                l2 = l2.next;
            }
        }
        dummy.next = l1==null ? l2 : l1;
        return ret.next;
    }
    
} 

もう一度楽しいことを言いたいのですが
、以下のマージ関数を見てください。

public static ListNode merge(ListNode l1, ListNode l2){
    
    
        if(l1 == null) return l2;
        if(l2 == null) return l1;
        if(l1.val < l2.val){
    
    
            l1.next = merge(l1.next, l2);
            return l1;
        }else{
    
    
            l2.next = merge(l1, l2.next);
            return l2;
        }
    }

LEETCodeでの提出は受け入れられますが、Niukeでは受け入れられません:
ここに画像の説明を挿入
なぜハンマーがそのような結果をもたらすのですか?@我の問題を誰が知っているか、ありがとう。

クイックソート:
ここでのパーティション(ListNodeヘッド、ListNodeエンド)関数は、ダブルポインター戦略を使用します。これは、左右のダブルポインターではなく、p1とp2です。p1の前のものはヘッドノードよりも小さく、1つはp1が大きい後にヘッドノードは、p2が...トラバーサルのために使用されている
上での描画画像と、ここでの言葉、
二つのポインタは、P1およびP2が必要とされているが、その差は、これら2つのポインタが前方から後方に移動し、P1の前におくことです移動中。キーはすべて選択したキーよりも小さく、p1とp2の間のキーは選択したキーよりも大きいため、p2が最後に到達すると、p1とキー値の交換がクイックソートを完了します。
ここに画像の説明を挿入

public ListNode sortList(ListNode head) {
    
    
        if(head== null || head.next == null)return head;
        quicksort(head, null);
        return head;
    }
    public void quicksort(ListNode head, ListNode end){
    
    
        if(head == end) return;
        ListNode node = partition(head, end);
        quicksort(head, node);
        quicksort(node.next, end);
    }
    public ListNode partition(ListNode head, ListNode end){
    
    
        ListNode p1 = head, p2 = head.next;
        while(p2 != end){
    
    
            if(p2.val < head.val){
    
    
                p1 = p1.next;

                int tem = p1.val;
                p1.val = p2.val;
                p2.val = tem;
            }
            p2 = p2.next;
        }
        if(p1 != head){
    
    
            int tem = p1.val;
            p1.val = head.val;
            head.val = tem;
        }
        return p1;
    }

おすすめ

転載: blog.csdn.net/qq_45531729/article/details/110679004