import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* public ListNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @return ListNode类
*/
public ListNode sortLinkedList(ListNode head) {
// 如果头结点为空,或者只有一个节点,那么直接返回头结点
if (head == null || head.next == null) {
return head;
}
ListNode middle = findMiddle(head);
ListNode middleNext = middle.next;
// 将中间链表断开
middle.next = null;
// 分别递归左右链表
ListNode sortLinkedList1 = sortLinkedList(head);
ListNode sortLinkedList2 = sortLinkedList(middleNext);
// 合并链表
return merge(sortLinkedList1, sortLinkedList2);
}
private ListNode findMiddle(ListNode head) {
ListNode slow = head;
ListNode fast = head.next;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
private ListNode merge(ListNode listNode1, ListNode listNode2) {
ListNode cur = new ListNode(-1);
ListNode result = cur;
while (listNode1 != null && listNode2 != null) {
if (listNode1.val < listNode2.val) {
cur.next = listNode1;
listNode1 = listNode1.next;
} else {
cur.next = listNode2;
listNode2 = listNode2.next;
}
cur = cur.next;
}
if(listNode1!=null){
cur.next = listNode1;
}
if(listNode2!=null){
cur.next = listNode2;
}
return result.next;
}
// 方法二:将链表排序转到集合中,用API做,但是很可能面试官考的就是让你用归并排序,用方法二的话,基本上学过算法的都会做,有点投机取巧。
public ListNode sortLinkedList (ListNode head) {
// write code here
if(head==null||head.next==null) return head;
ArrayList<Integer> l = new ArrayList<>();
ListNode node = head;
while(node!=null){
l.add(node.val);
node = node.next;
}
Collections.sort(l); //排序
node = head; //重新指回头节点
for(int i=0; i<l.size(); i++){
node.val = l.get(i); //赋值
node = node.next;
}
return head;
}
}
本题知识点分析:
1.归并排序
2.链表合并
3.数学模拟
本题解题思路分析:
1.利用归并排序,和数组差不多的形式,无非是链表需要找中间节点还有合并有序链表,其他都差不多
2.归并排序,分治思想,分别递归左右链表,然后合并已经排序的有序链表返回
本题使用编程语言: Java
如果你觉得本篇文章对你有帮助的话, 可以点个赞支持一下,感谢~

京公网安备 11010502036488号