147.对链表进行插入排序 题目 对链表进行插入排序。
示例 1:
输入: 4->2->1->3
输出: 1->2->3->4
示例 2:
输入: -1->5->3->4->0
输出: -1->0->3->4->5
方法一 新建一个列表,将链表中的元素全部加入到这个链表中。然后对这个列表进行排序。最后将列表中排序好的元素再依次放回链表中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public ListNode insertionSortList (ListNode head) { List<Integer> list = new ArrayList<>(); ListNode cur = head; while (cur != null ){ list.add(cur.val); cur = cur.next; } Collections.sort(list); cur = head; for (int num : list){ cur.val = num; cur = cur.next; } return head; }
方法二 设置一个指针pre和一个指针cur,pre初始化为head,cur初始化为head.next。从前到后遍历链表中的每一个元素
如果pre所指的值小于cur所指的值(已经有序),那么pre和cur正常向后移动
如果pre所指的值大于cur所指的值,那么cur所指节点需要在前面已经有序的部分找到相应位置进行插入。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 public ListNode insertionSortList (ListNode head) { if (head == null || head.next == null ) return head; ListNode dummy = new ListNode(0 ); dummy.next = head; ListNode pre = head, cur = head.next; while (cur != null ){ if (pre.val <= cur.val){ pre = cur; cur = cur.next; } else { ListNode node = dummy; while (node.next != null && node.next.val < cur.val) node = node.next; pre.next = cur.next; cur.next = node.next; node.next = cur; cur = pre.next; } return dummy.next; }