链表插入排序

很简单,找到第一个逆序对,插入,注意头结点情况不同。然后如此反复即可。

注意Java中对象按引用传递,引用本身是按值传递的。

无附加头

public ListNode insertionSortList(ListNode head) {
        if(head == null || head.next == null)
        {
            return head;
        }
        
        ListNode currNode = head;
        while(currNode.next != null)
        {
            if(currNode.val <= currNode.next.val)
            {
                currNode = currNode.next;
            }else{
                ListNode p = currNode.next;
                currNode.next = currNode.next.next;
                if(p.val < head.val)
                {
                    p.next = head;
                    head = p;
                }else{
                    ListNode tmp = head;
                    while(p.val >= tmp.next.val)
                    {
                        tmp = tmp.next;
                    }
                    p.next = tmp.next;
                    tmp.next = p;
                }
            }
        }
        return head;
    }

有附加头:

    public ListNode insertionSortList(ListNode head) {
         if(head == null || head.next == null)
         {
             return head;
         }
         ListNode dummyNode = new ListNode(0);
         dummyNode.next = head;
         ListNode pNode = head;
         while (pNode.next != null) 
         {
             if (pNode.val <= pNode.next.val) {
                pNode = pNode.next;
            }else {
                ListNode tmpNode = pNode.next;
                pNode.next = pNode.next.next;
                ListNode qNode = dummyNode;
                while (tmpNode.val >= qNode.next.val ) {
                    qNode = qNode.next;
                }
                tmpNode.next = qNode.next;
                qNode.next = tmpNode;
            }
         }
         return dummyNode.next;
        
    }

可以看出有附加头的,把插入统一处理了,简化了操作。

原文地址:https://www.cnblogs.com/zqiguoshang/p/5897991.html