148. 排序链表

题目:

给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。

示例1:

解题思路:

这道题是一道综合题,考察了链表中间节点+合并有序链表。首先我们链表中间节点,然后从中间结点的前一个节点处断开,分为两段链表。

然后对这两段更短的链表分别调用sortList,得到两段有序的链表。

最后合并这两段有序链表并返回结果。

详细题解可参见https://leetcode.cn/problems/sort-list/solutions/2993518/liang-chong-fang-fa-fen-zhi-die-dai-mo-k-caei

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;
    }
}
相关推荐
mmmmath_34 小时前
LeetCode.199.二叉树的右视图
数据结构·leetcode
Shaoshing9 小时前
前缀和与差分
java·数据结构·算法·前缀和·差分
mmmmath_39 小时前
LeetCode.429.N叉树的层序遍历
数据结构·leetcode
suhan10 小时前
【数据结构】三、栈和队列:6.链队列、双端队列、队列的应用(树的层次遍历、广度优先BFS、先来先服务FCFS)
数据结构·后端·算法
suhan11 小时前
【数据结构】三、栈和队列:5.顺序队列(循环队列)(初始化,判空判满,入队,出队,实例)
数据结构·后端·算法
suhan11 小时前
【数据结构】三、栈和队列:3.链栈(链栈栈的初始化,判空,进栈,出栈,读取栈顶,链栈实例)
数据结构·后端·算法
suhan11 小时前
【数据结构】三、栈和队列:4.栈的应用(括号匹配,四则运算表达式求值,进制转换,递归)
数据结构·后端·算法
suhan11 小时前
【数据结构】三、栈和队列:2.顺序栈&共享栈(顺序栈的初始化,判空,进栈,出栈,读取栈顶,顺序栈实例)
数据结构·后端·算法
SelectDB11 小时前
部署形态与存算分离速查:形态对照、配置项清单与关键命令片段
大数据·数据结构·数据库
0+11112 小时前
算法 --哈希表
数据结构·算法·散列表