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;
}
}
标签:head,ListNode,递归,val,int,148,next,链表,排序 来源: https://www.cnblogs.com/wsshub/p/15018300.html