题目描述(中等难度)

实现基于链表的插入排序。

解法一

所谓的插入排序,就是一次拿一个数把它插入到正确的位置。

举个例子。

4 2 1 3
res = []

拿出 4
res = [4]

拿出 2
res = [2 4]

拿出 1
res = [1 2 4] 

拿出 3
res = [1 2 3 4]

用代码的实现的话,因为要拿出一个要插入到已经排好序的链表中,首先肯定是依次遍历链表,找到第一个比要插入元素大的位置,把它插到前边。

至于插入的话,我们需要知道插入位置的前一个节点,所以我们可以用 node.next 和要插入的节点比较,node 就是插入位置的前一个节点了。

head 指针已经是最前了,所以我们可以用一个 dummy 指针,来将头指针的情况统一。

public ListNode insertionSortList(ListNode head) {
    if (head == null) {
        return null;
    }
    ListNode dummy = new ListNode(0);
    //拿出的节点
    while (head != null) {
        ListNode tempH = dummy;
        ListNode headNext = head.next;
        head.next = null; 
        while (tempH.next != null) {
            //找到大于要插入的节点的位置
            if (tempH.next.val > head.val) {
                head.next = tempH.next;
                tempH.next = head; 
                break;
            }
            tempH = tempH.next;
        }
        //没有执行插入,将当前节点加到末尾
        if (tempH.next == null) {
            tempH.next = head;
        }
        head = headNext;
    }
    return dummy.next;
}

这里-space-) 还有另一种写法,分享一下。

public ListNode insertionSortList(ListNode head) {
    if( head == null ){
        return head;
    }

    ListNode helper = new ListNode(0); //new starter of the sorted list
    ListNode cur = head; //the node will be inserted
    ListNode pre = helper; //insert node between pre and pre.next
    ListNode next = null; //the next node will be inserted
    //not the end of input list
    while( cur != null ){
        next = cur.next;
        //find the right place to insert
        while( pre.next != null && pre.next.val < cur.val ){
            pre = pre.next;
        }
        //insert between pre and pre.next
        cur.next = pre.next;
        pre.next = cur;
        pre = helper;
        cur = next;
    }

    return helper.next;
}

基本就是按照插入排序的定义来了,注意的就是链表节点的指向了,还有就是 dummy 节点的应用,就不需要单独处理头结点了。

results matching ""

    No results matching ""