6.1 LC148 排序链表 选择排序版 Java力扣刷题笔记

快慢指针(注意链表长度为偶数时,返回第 2 个结点的细节)

教练明天我想做这里面的题!
快慢指针研究透了不香嘛!

LC148 排序链表

我的刷题笔记
排序链表
老题新做
之前快速排序也是拿这个题开的头
结果时间复杂度直接给我爆炸了(为啥要快排链表啊!!)

1.读题

在这里插入图片描述

2.解题思路

归并排序…嘶 忘掉了鸭
只能先看着题解慢慢回忆下了
本题暂时使用个递归的做法
参考题解 【148.排序链表】归并排序 详解 java
链表中的归并排序我们需要注意——

  • 需要找到链表的中间结点 这里定义为 midNode
  • 需要进行两个链表的合并

康康动图就明白了~

3.代码逻辑

【1】想到要将链表通过递归 一步一步分开
康康动图就明白了~
【2】这样就需要找到中间结点
【3】写出 找到中间结点 的函数
在这里插入图片描述
【4】之后不断地进行递归排序

这里其实没太弄懂 是咋每一趟排序都做到从小到大排序的23333

在这里插入图片描述
【5】最后要把两个链表合并起来
在这里插入图片描述
别忘了写合并函数~
在这里插入图片描述

4.Java代码

class Solution {
    public ListNode sortList(ListNode head) {
        if (head == null || head.next == null){
            return head;//退出条件
        }

        ListNode midNode = findMidNode(head);//这个是链表的中间结点
        //之后我们要写出 找到中间结点的函数~

        ListNode rightHead = midNode.next;//定义好右边链表的头结点
        midNode.next = null;//在中间结点处断开链表~

        ListNode left = sortList(head);//开始递归~对左边的链表进行排序
        ListNode right = sortList(rightHead);//对右边的链表进行排序

        return merge(left, right);//将左右链表进行合并
    }
    //01 写出寻找中间结点的函数
    //其实这个本身也可以作为一道题嘛~
    public ListNode findMidNode(ListNode head){
        if (head == null || head.next == null){
            return head;//退出条件
        }
        //熟悉的双指针法~快指针一下跑俩结点 慢指针跑一个
        //等快指针指向空或快指针的下一位指向空 就说明慢指针是指向中间辽~
        ListNode slow = head;
        ListNode fast = head.next.next;

        while(fast != null && fast.next != null){
            //注意这里的条件
            slow = slow.next;
            fast = fast.next.next;
        }
        return slow;
    }   

    //02 写出链表合并的函数
    public ListNode merge(ListNode left, ListNode right){
        ListNode dummyNode = new ListNode(0);
        ListNode current = dummyNode;
        while(left != null  && right != null){
            if (left.val < right.val) {
                current.next = left;
                left = left.next;
            }
            else{
                current.next = right;
                right = right.next;
            }
            current = current.next;
        }   
        current.next = left != null ? left : right;
        return dummyNode.next;
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值