力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
给你链表的头结点
head,请将其按 升序 排列并返回 排序后的链表
题解:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
- class Solution {
- public ListNode sortList(ListNode head) {
- return sortList(head, null);
- }
-
- public ListNode sortList(ListNode head, ListNode tail) {
- if (head == null) {
- return head;
- }
- 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;
- }
- ListNode mid = slow;
- ListNode list1 = sortList(head, mid);
- ListNode list2 = sortList(mid, tail);
- ListNode sorted = merge(list1, list2);
- return sorted;
- }
-
- public 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;
- }
- }