对链表进行插入排序。
插入排序的动画演示如上。从第一个元素开始,该链表可以被认为已经部分排序(用黑色表示)。
每次迭代时,从输入数据中移除一个元素(用红色表示),并原地将其插入到已排好序的链表中。
插入排序算法:
插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。
每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。
重复直到所有输入数据插入完为止。
示例 1:
输入: 4->2->1->3输出: 1->2->3->4
示例 2:
输入: -1->5->3->4->0输出: -1->0->3->4->5
答案:
1public ListNode insertionSortList(ListNode head) { 2 if (head == null) 3 return head; 4 ListNode helper = new ListNode(0); 5 ListNode cur = head; 6 ListNode pre = helper; 7 ListNode next = null; 8 while (cur != null) { 9 next = cur.next;10 while (pre.next != null && pre.next.val < cur.val) {11 pre = pre.next;12 }13 cur.next = pre.next;14 pre.next = cur;15 pre = helper;16 cur = next;17 }18 return helper.next;19}
解析:
关于排序前面我们介绍了十几种排序算法,这里让使用插入排序,其实插入排序并不难,这里难的是链表的断开和重连。当然我们还可以使用其他的方法,比如我们把链表的每一个节点全部断开,然后存放到数组中,接着在排序,最后再把排序好的数组按顺序全部再连接起来即可。关于排序算法可以看下
本文分享自微信公众号 - 数据结构和算法(sjjghsf)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。