对链表进行插入排序:用Java实现
147. 对链表进行插入排序 - 力扣(LeetCode)
按题目要求,在原链表上进行排序。此处使用递归和非递归两种反式。
- 列表中的节点数在
[1, 5000]范围内-5000 <= Node.val <= 5000
方法一:非递归

首先我们创建指向head的头结点,可以认为此时这个链表已经有一个有序结点了,然后再设计一个lastNode 变量指向最后一个有序的节点(如果head!=null,那么lastNode第一个指向的就是head);最后思考怎么排列呢?——》设计一个指向lastNode.next的变量curr。如果curr.val<lastNode.val则设计pre变量从duMyHead开始遍历,直到pre.val<curr.val,pre.next.val>=curr.val,就把curr插入到pre后,否则将lastNode=curr;(注意前面的都是排好了的,后面找到比lastNode.val小的就在前面找空插入就行)
代码实现:
public ListNode insertionSortList(ListNode head){if(head==null) return null;ListNode dummyHead = new ListNode(-5001);dummyHead.next=head;ListNode lastNode = head;ListNode curr=head.next;while(curr!=null){if(curr.val<lastNode.val){for(ListNode pre=dummyHead;pre!=null;pre=pre.next){if(pre.val<=curr.val&&pre.next.val>curr.val){lastNode.next=curr.next;curr.next=pre.next;pre.next=curr;if(pre==dummyHead) dummyHead.next=curr; //更新头结点,时刻指向排好的第一位break;}}}else{lastNode=curr;}curr=lastNode.next;}return dummyHead.next;}
方法二:递归
递归非常麻烦,只能结合代码理解了,我写的时候也是调试了很久。。。
ListNode minNode ; //时刻指向排序好的最小值public ListNode insertionSortList(ListNode head) {minNode= head; //开始指向head,认为他是第一个有序的值if(head==null) return null;insert(head,null);return minNode;}public ListNode insert(ListNode head,ListNode cur){ListNode node=null; //接着看下面if(head==null) return null;while(head!=null){if(cur==null||head.val>=cur.val){ //一开始cur==null递归,或有序后的第一个值大于cur.val,然后将这里的head指向的节点给到下一个cur.node = insert(head.next,head);}else{if(head.val<cur.val)return head; //head.val小于cur的就返回这个节点}if(node!=null&&node.val<head.val){if(node!=null&&node.val<minNode.val) minNode=node;head.next=node.next; //进行插入if(cur!=null) cur.next=node;node.next=head;head=node;}if(node!=null&&cur!=null&&node.val<cur.val){// if(cur.val<minNode.val) minNode=cur;return node;}if(node==null) return null;}return minNode;}