题解 | #单链表的排序#

单链表的排序

https://www.nowcoder.com/practice/f23604257af94d939848729b1a5cda08

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    public ListNode sortInList(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        ListNode middle = getMiddle(head);
        ListNode nextOfMiddle = middle.next;
        middle.next = null;
        ListNode left = sortInList(head);
        ListNode right = sortInList(nextOfMiddle);
        ListNode sortedList = merge(left, right);
        return sortedList;
    }

    private ListNode getMiddle(ListNode head) {
        ListNode slow = head, fast = head.next;
        while (fast != null && fast.next != null) {
            slow = slow.next;
            fast = fast.next.next;
        }
        return slow;
    }

    private ListNode merge(ListNode left, ListNode right) {
        ListNode result = null;
        if (left == null) {
            return right;
        }
        if (right == null) {
            return left;
        }
        if (left.val <= right.val) {
            result = left;
            left = left.next;
        } else {
            result = right;
            right = right.next;
        }
        ListNode temp = result;
        while (left != null && right != null) {
            if (left.val <= right.val) {
                temp.next = left;
                left = left.next;
            } else {
                temp.next = right;
                right = right.next;
            }
            temp = temp.next;
        }
        if (left == null) {
            temp.next = right;
        } else {
            temp.next = left;
        }
        return result;
    }
}

归并排序:1.首先建立一个使用快慢指针找到中间节点的方法;2.分割链表:将中间节点的 next 指针设置为 null,从而将链表分割成两个独立的链表;3.合并链表:这个方法 merge 的目的是合并两个已排序的链表 left 和 right。它通过比较两个链表的节点值,将较小的节点添加到结果链表中,并相应地移动 left 和 right 指针。这个过程重复进行,直到一个链表结束,然后将另一个链表剩余的节点全部添加到结果链表中。

全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务