题目
Sort a linked list using insertion sort.
标签:Linked List、Sort
相似问题: (M) Sort List
题意
在单链表这种数据结构上进行插入排序。
解题思路
插入排序就是将待排序的一串数字(可以是数组,链表等)分为有序区和无序区,每次都从无序区取出一个需要排序的数插入到有序区合适的位置。时间复杂度为O(n^2)。
在本题中要注意链表的指针的改变。
代码
class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
public class Solution {
public ListNode insertionSortList(ListNode head) {
ListNode root = new ListNode(0);
root.next = head;
ListNode p = head;//当前指针
ListNode q;
ListNode r;
while (p != null && p.next != null) {
if (p.val <= p.next.val) {//当前值小于等于下一个节点的值,无需排序。
p = p.next;
} else {
q = p.next;//q指向当前指针的下一节点,即需要被插入排序的节点
p.next = q.next;//当前指针指向q的下一节点,即删除需要被插入排序的节点
r = root;//指向排序区的头结点
while (r.next.val <= q.val) {//找到第一个比q大的节点的前驱节点
r = r.next;
}
q.next = r.next;//插入这个节点
r.next = q;
}
}
return root.next;
}
}