题目链接:https://leetcode.com/problems/insertion-sort-list/
题目:
Sort a linked list using insertion sort.
解题思路:
1、插入排序的通用算法
2、链表的插入排序和数组的插入排序存在差异:
- 链表:当前要插入的元素,对已排好序的链表从前往后比较
- 数组:当前要插入的元素,对已排好序的数组从后往前比较(需要往后挪元素,为插入的元素腾坑)
3、由于插入和删除节点需要知道该节点的先驱,又为了减少指针的个数的使用(不单独采用一个指针指向要比较的元素的前驱),比较节点时一律采取比较当前指针所指节点的后继。即:p指向有序链表的最后一个节点。q指向有序链表中的节点。比较时采用 p.next 和 q.next。
注意:
插入情况大致分三种:
1、插入到头结点之前
2、插入到有序链表最后一个节点之前
3、插入到有序链表最后一个节点之后(需将指针p向后移动一个节点)
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode insertionSortList(ListNode head) {
if(head == null)
return head;
ListNode p = head;
while(p.next != null) {
ListNode temp = p.next;
if(p.next.val < head.val) {
temp = p.next;
p.next = p.next.next;
temp.next = head;
head = temp;
} else {
ListNode q = head;
while(q.next.val <= p.next.val && p.next != q.next)
q = q.next;
if(q.next != p.next) {
temp = p.next;
p.next = p.next.next;
temp.next = q.next;
q.next = temp;
}
}
if(temp.val >= p.val)
p = p.next;
}
return head;
}
}