leetcode147:对链表进行插入排序

package com.mxnet;

public class Solution147 {

    public static void main(String[] args) {

    }

    /**
     * Q: 给定单个链表的头 head ,使用 插入排序 对链表进行排序,并返回 排序后链表的头
     * @param head
     * @return
     * 思路:
     * 1. 先判断节点是否为空或者是否只有一个元素
     * 2. 定义辅助节点dummyHead让其下一个元素指向head,方便可以在head前插入元素
     * 3. 从第二个节点开始依次扫描节点,寻找当前节点要插入的位置
     * 4. 找到其位置后将其插入
     * 5. 返回dummyHead.next
     */
    public ListNode insertionSortList(ListNode head) {
        //若链表为空或者链表只有一个元素,直接返回head
        if (head == null || head.next == null){
            return head;
        }
        //创建dummyHead链表,让其后一个节点指向head
        ListNode dummyHead = new ListNode();
        dummyHead.next = head;
        //定义辅助指针finalNode指向排好序的链表的最后,默认指向head
        ListNode finalNode = head;
        //定义辅助指针cur保存当前要插入的元素,默认指向head.next
        ListNode cur = head.next;
        while (cur != null){
            if (cur.val >= finalNode.val){
                finalNode = finalNode.next;
            }else {
                //创建辅助指针prev记录当前节点要插入位置的前一个位置
                ListNode prev = dummyHead;
                //从前往后扫描节点,寻找当前节点要插入的位置
                while (prev.next.val <= cur.val){
                    prev = prev.next;
                }
                //找到要插入的位置后将其插入
                //将排好序链表的最后一个元素指向当前节点的下一个元素
                finalNode.next = cur.next;
                //将当前节点进行插入
                cur.next = prev.next;
                prev.next = cur;
            }
            //节点后移,判断下一个节点
            cur = finalNode.next;
        }
        return dummyHead.next;
    }

}
posted @ 2022-08-26 17:15  mx_info  阅读(27)  评论(0)    收藏  举报