148. 排序链表

2021/7/16 6:06:29

本文主要是介绍148. 排序链表,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

非递归的解法无语了,根本不是模仿递归。
递归解法两条链总是几乎一样个数的,题解的非递归解法,可能会出现个数悬殊的情况。
非递归:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode sortList(ListNode head) {
        if(head==null||head.next==null)return head;
        ListNode p=head;
        int len=0;
        while(p!=null){
            len++;
            p=p.next;
        }
        ListNode hair=new ListNode();
        hair.next=head;
        for(int size=1;size<=len;size*=2){
            ListNode cur=hair.next;
            ListNode tail=hair;
            while(cur!=null){
                ListNode left=cur;
                ListNode right=cut(left,size);//left----null;right---null
                cur=cut(right,size);//left--null;right--null;cur---null;
                //如果right后面不足size个,那cur为空。且没剪。只有left和right开头两条链,且right是不足个数的

                ListNode tmp=merge(left,right);
                while(tmp!=null){
                    tail.next=tmp;
                    tmp=tmp.next;
                    tail=tail.next;
                }

            }
            
        }
        return hair.next;

    }
    ListNode cut(ListNode K,int size){//返回剪掉链表后的右边的表头
        if(size==0||K==null)return null;
        int cnt=0;
        ListNode pre=null;
        while(cnt<size&&K!=null){
            cnt++;
            pre=K;
            K=K.next;
        }
        if(cnt!=size){
            //没到个数提前退出了,那就不用剪掉
            return null;//空,交由上层处理
        }
        pre.next=null;//剪断
        return K;

    }

    ListNode merge(ListNode A,ListNode B){
        if(A==null&&B==null)return null;
        else if(A==null) return B;
        else if(B==null) return A;
        
        ListNode hair=new ListNode();
        ListNode p=hair;
        while(A!=null&&B!=null){
            if(A.val<B.val){
                p.next=A;
                p=A;
                A=A.next;
            }
            else{
                p.next=B;
                p=B;
                B=B.next;
            }       
        }
        if(A!=null)p.next=A;
            if(B!=null)p.next=B;
        return hair.next;
    }
}


这篇关于148. 排序链表的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程