/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
/**
* 一定要注意在不另外开辟结点作为头结点的情况下, 链表的头结点是会发生变化的
* 可开辟一个新的结点作为头结点, 这样会降低一定的难度
* 时间复杂度为O(n^2), 空间复杂度为O(1)
*/
public static ListNode insertionSortList(ListNode head) {
if (head == null) {
return head;
}
//now用于记录要排序的结点
ListNode now = head.next;
//pre用于记录要排序结点的前一个结点
ListNode pre = head;
//resultHead用于记录每一次插入排序完成后的头结点
ListNode resultHead = head;
while (now != null) {
//若要排序的结点小于它的前一个结点, 则进行排序, 否则指向下一个
if (now.val < pre.val) {
//temp用于记录插入前的头结点, 然后进行遍历
ListNode temp = resultHead;
//preTemp用于记录temp结点的前一个结点
ListNode preTemp = null;
//当当前排序结点小于未排序前链表的头结点, 说明它在排序后将会成为链表头结点
if (now.val < resultHead.val) {
resultHead = now;
}
//终止条件为temp遍历至now, 兜底条件
while (temp != now) {
//找到了插入结点的位置, 否则移动temp位置
if (temp.val > now.val) {
pre.next = now.next;
now.next = temp;
//若插入结点不会成为头结点
if (preTemp != null) {
preTemp.next = now;
}
now = pre.next;
break;
} else {
preTemp = temp;
temp = temp.next;
}
}
} else {
pre = now;
now = now.next;
}
}
return resultHead;
}
}
LeetCode-147-对链表进行插入排序
最新推荐文章于 2022-08-31 11:51:56 发布