leetcode 147. 对链表进行插入排序【链表、排序】

对链表进行插入排序,插入排序的基本思想是对链表分为两个部分,前半部分为已经排序部分,后半部分为未排序部分。每次插入过程取未排序部分的第一个元素作为待排序元素,然后遍历已排序部分的元素,找到第一个比待排序元素大的元素,将待排序元素插入到该元素前面,至此完成了一次插入排序操作。

class Solution {
    public ListNode insertionSortList(ListNode head) {
        if(head==null || head.next == null)return head;
        ListNode dummy = new ListNode(-1);
        ListNode pre;
        dummy.next = head;
        while(head!= null && head.next != null){
        //如果head.next指向待排序元素,如果head的值小于等于head.next的值,说明这两个数已经排好序,继续向下遍历
            if(head.val<=head.next.val){
                head = head.next;
                continue;
            }
            //每次都从链表头开始遍历已排序部分
            pre = dummy;
            //在已排序部分找到比当前节点大的节点
            while(pre.next.val < head.next.val)pre = pre.next;
            //cur节点表示待排序节点
            ListNode cur = head.next;
            //head节点后移,
            head.next = cur.next;
            //将cur插入到第一个比cur大的节点前面
            cur.next = pre.next;
            pre.next = cur;
        }
        return dummy.next;
    }
}
发布了55 篇原创文章 · 获赞 0 · 访问量 774

猜你喜欢

转载自blog.csdn.net/er_ving/article/details/104978543