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. 排序链表的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-02Java管理系统项目实战入门教程
- 2024-11-02Java监控系统项目实战教程
- 2024-11-02Java就业项目项目实战:从入门到初级工程师的必备技能
- 2024-11-02Java全端项目实战入门教程
- 2024-11-02Java全栈项目实战:从入门到初级应用
- 2024-11-02Java日志系统项目实战:初学者完全指南
- 2024-11-02Java微服务系统项目实战入门教程
- 2024-11-02Java微服务项目实战:新手入门指南
- 2024-11-02Java项目实战:新手入门教程
- 2024-11-02Java小程序项目实战:从入门到简单应用