牛客网每日一道 LC5 使用插入排序对链表进行排序 5/147

在这里插入图片描述
解题思路:

解题思路就是根据插入排序的思想,每次遍历都保证前n个数都是排好序的,那么按照原生的插入排序,是从当前元素前一个元素开始一个一个往前判断,只要比前面元素小,则往前移动,一直移动到有一个元素小于它或者移动到头部了则停止,这个位置就是当前元素在这一趟中应该在的位置。但是链表中不好往前移,只能每次都从头部开始往后判断,一直找到第一个比当前元素大的元素停止,然后调整一下指针,就是让当前元素插入到本趟合适的位置。由于有可能要与第一个元素交换,所以搞一个虚拟头节点处理起来会简单一点。

参考Java实现:
链接:https://www.nowcoder.com/questionTerminal/152bc6c5b14149e49bf5d8c46f53152b?f=discussion

class Solution {
    public ListNode insertionSortList(ListNode head) {
        //1.判空
        if(head == null || head.next == null){
            return head;
        }
        //2.新建一个节点,用来存新排序好的链表
        ListNode dummy = new ListNode(0);
        //3.curr指向的节点及其后面所有节点都是未排序的,前面的都是排好序的
        ListNode curr = head;
        //4.每次循环,pre都重新指向dummy,每一次都需要扫描排序好的链表
        ListNode pre = dummy;
        while(curr != null){    
            //5.保存一下当前节点后面一个节点的引用
            ListNode next = curr.next;
            //6.每次都从dummy节点下一个开始找,前面都是排好序的,如果小于当前节点则指针后移,一直找到pre.next为空
            //或者比当前节点大的时候,停止,表明pre的下一个节点就是当前节点应该放的位置
            while(pre.next != null && pre.next.val < curr.val){  //两个条件的前后顺序不能调换,因为要先判断非空,才能判断里面的值的大小
                pre = pre.next;
            }
            //7.找到当前节点应该放的位置之后,下面的工作就是移动指针,让curr插到pre和pre.next中间
            //然后让curr后移一位,前面都是排好序的
            curr.next = pre.next;  //一个结点插入一个链表,要先把该结点接上链表的尾巴,然后前面部分再接上这个结点就可以了
            pre.next = curr;
            curr = next;
        }
        //8.dummy后面就是我们所需要的用插入排序排好序的链表
        return dummy.next;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值