题目
1- 思路
- 排序链表,将每个元素看做一个单独的链表 ——> 归并排序 ——> 每次将单独的链表合并
2- 实现
⭐148. 排序链表——题解思路
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/3b1be2a40baf461e97a6882ea799d840.png)
class Solution {
public ListNode sortList(ListNode head) {
int len = 0;
ListNode forH = head;
while(forH!=null){
len++;
forH = forH.next;
}
ListNode dummyHead = new ListNode(-1);
dummyHead.next = head;
for(int subLen = 1 ; subLen < len;subLen*=2){
ListNode prev = dummyHead, cur = dummyHead.next;
while(cur!=null){
ListNode head1 = cur;
for(int i = 1 ; i < subLen && cur.next !=null ; i++){
cur = cur.next;
}
ListNode head2 = cur.next;
cur.next = null;
cur = head2;
for(int i = 1 ; i < subLen && cur!=null && cur.next !=null ;i++){
cur = cur.next;
}
ListNode next = null;
if(cur!=null){
next = cur.next;
cur.next = null;
}
ListNode merged = mergeList(head1,head2);
prev.next = merged;
while(prev.next!=null){
prev = prev.next;
}
cur = next;
}
}
return dummyHead.next;
}
public ListNode mergeList(ListNode head1,ListNode head2){
ListNode dummyHead = new ListNode(0);
ListNode cur = dummyHead;
ListNode forA = head1;
ListNode forB = head2;
while(forA!=null && forB !=null){
if(forA.val < forB.val){
cur.next = forA;
forA = forA.next;
}else{
cur.next = forB;
forB = forB.next;
}
cur = cur.next;
}
if(forA!=null){
cur.next = forA;
}else{
cur.next = forB;
}
return dummyHead.next;
}
}
3- ACM 实现
public class sortLink {
static class ListNode{
int val;
ListNode next;
ListNode(){}
ListNode(int x){
val = x;
}
}
public static ListNode sortList(ListNode head){
int len = 0;
ListNode l = head;
while (l!=null){
len++;
l = l.next;
}
ListNode dummyHead = new ListNode(-1);
dummyHead.next = head;
for(int subLen = 1 ; subLen < len;subLen*=2){
ListNode prev = dummyHead,cur = dummyHead.next;
while(cur!=null){
ListNode head1 = cur;
for(int i = 1; i < subLen && cur.next!=null; i++){
cur = cur.next;
}
ListNode head2 = cur.next;
cur.next = null;
cur = head2;
for(int i = 1; i < subLen && cur!=null && cur.next!=null ; i++){
cur = cur.next;
}
ListNode next = null;
if(cur!=null){
next = cur.next;
cur.next = null;
}
ListNode merged = merged(head1,head2);
prev.next = merged;
while(prev.next!=null){
prev = prev.next;
}
cur = next;
}
}
return dummyHead.next;
}
public static ListNode merged(ListNode head1, ListNode head2){
ListNode dummyHead = new ListNode(-1);
ListNode cur = dummyHead;
while(head1!=null && head2 !=null){
if(head1.val<head2.val){
cur.next = head1;
head1 = head1.next;
}else{
cur.next = head2;
head2 = head2.next;
}
cur = cur.next;
}
if(head1!=null){
cur.next = head1;
}else{
cur.next = head2;
}
return dummyHead.next;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("输入链长度");
int n = sc.nextInt();
System.out.println("输入链表元素");
ListNode head=null,tail=null;
for(int i = 0 ; i < n;i++){
ListNode newNode = new ListNode(sc.nextInt());
if(head==null){
head = newNode;
tail = newNode;
}else{
tail.next = newNode;
tail = tail.next;
}
}
ListNode res = sortList(head);
System.out.println("排序后的链表是");
while(res!=null){
System.out.print(res.val +" ");
res = res.next;
}
}
}