题目描述(中等难度)

147. Insertion Sort List - 图1

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

解法一

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

举个例子。

  1. 4 2 1 3
  2. res = []
  3. 拿出 4
  4. res = [4]
  5. 拿出 2
  6. res = [2 4]
  7. 拿出 1
  8. res = [1 2 4]
  9. 拿出 3
  10. res = [1 2 3 4]

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

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

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

  1. public ListNode insertionSortList(ListNode head) {
  2. if (head == null) {
  3. return null;
  4. }
  5. ListNode dummy = new ListNode(0);
  6. //拿出的节点
  7. while (head != null) {
  8. ListNode tempH = dummy;
  9. ListNode headNext = head.next;
  10. head.next = null;
  11. while (tempH.next != null) {
  12. //找到大于要插入的节点的位置
  13. if (tempH.next.val > head.val) {
  14. head.next = tempH.next;
  15. tempH.next = head;
  16. break;
  17. }
  18. tempH = tempH.next;
  19. }
  20. //没有执行插入,将当前节点加到末尾
  21. if (tempH.next == null) {
  22. tempH.next = head;
  23. }
  24. head = headNext;
  25. }
  26. return dummy.next;
  27. }

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

  1. public ListNode insertionSortList(ListNode head) {
  2. if( head == null ){
  3. return head;
  4. }
  5. ListNode helper = new ListNode(0); //new starter of the sorted list
  6. ListNode cur = head; //the node will be inserted
  7. ListNode pre = helper; //insert node between pre and pre.next
  8. ListNode next = null; //the next node will be inserted
  9. //not the end of input list
  10. while( cur != null ){
  11. next = cur.next;
  12. //find the right place to insert
  13. while( pre.next != null && pre.next.val < cur.val ){
  14. pre = pre.next;
  15. }
  16. //insert between pre and pre.next
  17. cur.next = pre.next;
  18. pre.next = cur;
  19. pre = helper;
  20. cur = next;
  21. }
  22. return helper.next;
  23. }

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

windliang wechat

添加好友一起进步~

如果觉得有帮助的话,可以点击 这里 给一个 star 哦 ^^

如果想系统的学习数据结构和算法,强烈推荐一个我之前学过的课程,可以点击 这里 查看详情