题目:
给你链表的头结点 head
,请将其按 升序 排列并返回 排序后的链表 。
class Solution {public ListNode sortList(ListNode head) {return sortList(head, null);}private ListNode sortList(ListNode head, ListNode tail) {if (head == null)return null;if (head.next == tail) {head.next = null;return head;}// 找到链表的中点ListNode slow = head, fast = head;while (fast != tail && fast.next != tail) {slow = slow.next;fast = fast.next.next;} // 循环结束 slow是中点ListNode mid = slow;ListNode list1 = sortList(head, mid);ListNode list2 = sortList(mid, tail);ListNode sorted = merge(list1, list2);return sorted;}// 合并两个有序链表private ListNode merge(ListNode head1, ListNode head2) {ListNode dummyHead = new ListNode(0); // 哨兵ListNode temp = dummyHead, temp1 = head1, temp2 = head2;while(temp1 != null && temp2 != null) {if (temp1.val <= temp2.val) {temp.next = temp1;temp1 = temp1.next;} else {temp.next = temp2;temp2 = temp2.next;}temp = temp.next;}if (temp1 != null) {temp.next = temp1;} else if (temp2 != null) {temp.next = temp2;}return dummyHead.next;}
}
class Solution {// 自底向顶,从单独的1个有序开始合并public ListNode sortList(ListNode head) {if (head == null) {return head;}int length = 0;ListNode node = head;while (node != null) {length++;node = node.next;}ListNode dummyHead = new ListNode(0, head); // 哨兵for (int subLength = 1; subLength < length; subLength <<= 1) {ListNode prev = dummyHead, curr = dummyHead.next;while (curr != null) {// 前两个有序子链ListNode head1 = curr;for (int i = 1; i < subLength && curr.next != null; i++) {curr = curr.next;}ListNode head2 = curr.next;curr.next = null;curr = head2;for (int i = 1; i < subLength && curr != null && curr.next != null; i++) {curr = curr.next;}// 处理第 3 4个子链开始需要的情况ListNode next = null;if (curr != null) {next = curr.next;curr.next = null;}ListNode merged = merge(head1, head2);prev.next = merged;// 找到第3个子链的headwhile (prev.next != null) {prev = prev.next;}curr = next;}}return dummyHead.next;}
}