题目:
给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。
示例1:
解题思路:
这道题是一道综合题,考察了链表中间节点+合并有序链表。首先我们链表中间节点,然后从中间结点的前一个节点处断开,分为两段链表。
然后对这两段更短的链表分别调用sortList,得到两段有序的链表。
最后合并这两段有序链表并返回结果。
java
/**
* 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 head2 = middleNode(head);
head = sortList(head);
head2 = sortList(head2);
return mergeTwoList(head, head2);
}
private ListNode middleNode(ListNode head){
ListNode pre = head, slow = head, fast = head;
while(fast != null && fast.next != null){
pre = slow;
slow = slow.next;
fast = fast.next.next;
}
pre.next = null;
return slow;
}
private ListNode mergeTwoList(ListNode head, ListNode head2){
ListNode dummy = new ListNode();
ListNode cur = dummy;
while(head != null && head2 != null){
if(head.val <= head2.val){
cur.next = head;
head = head.next;
}else{
cur.next = head2;
head2 = head2.next;
}
cur = cur.next;
}
cur.next = head != null ? head : head2;
return dummy.next;
}
}