当前位置: 首页 > 后端技术 > Java

牛客网高频算法题系列-BM12-单链表排序

时间:2023-04-01 15:48:24 Java

牛客网高频算法题系列-BM12-单链表排序首先判断如果链表为空或者只有一个节点,则有不用排序,直接返回原链表。否则,使用额外空间进行排序,过程如下:首先遍历链表,将所有节点值暂存在一个List中;然后,使用库函数对List进行排序(也可以使用各种排序算法进行排序);最后,把排序后的节点值构造成一个新的链表返回。方案二:归并排序使用递归对原链表进行排序。递归处理过程如下:首先需要判断链表是否为空或者只有一个节点,则不需要处理,直接返回原链表;然后,使用快慢指针找到链表的中点位置;然后递归调用中点左右两个链表;然后,合并左右链表;最后返回合并后的链表。代码importjava.util.ArrayList;importjava.util.Collections;importjava.util.List;publicclassBm012{/***数组排序**@paramheadListNodeclass头节点*@returnListNodeclass*/publicstaticListNodesortInList(ListNodehead){if(head==null||head.next==null){returnhead;}Listnodes=newArrayList<>();while(head!=null){nodes.add(head.val);head=head.next;}//使用库函数对数组进行排序Collections.sort(nodes);ListNodenewHead=newListNode(-1);ListNodecur=newHead;for(Integerval:nodes){cur.next=newListNode(val);cur=cur.next;}返回newHead.next;}/***归并排序**@paramheadListNodeclass头节点*@returnListNodeclass*/publicstaticListNodesortInList2(ListNodehead){if(head==null||head.next==null){返回头;}//使用快慢指针寻找链表的中点ListNodefast=head.next,slow=head;while(fast!=null&&fast.next!=null){slow=slow.next;fast=fast.next.next;}ListNodetmp=slow.next;慢.next=null;//递归排序左右边ListNodeleft=sortInList(head);ListNoderight=sortInList(tmp);//创建一个新的链表ListNodenewHead=newListNode(-1);ListNodecur=newHead;//合并左右链表while(left!=null&&right!=null){if(left.val