版权声明:我的GitHub:https://github.com/617076674。真诚求星! https://blog.csdn.net/qq_41231926/article/details/86186438
我的LeetCode代码仓:https://github.com/617076674/LeetCode
原题链接:https://leetcode-cn.com/problems/insertion-sort-list/description/
题目描述:
知识点:插入排序、链表
思路:用链表模拟插入排序的过程
为了避免对头节点是否为null的讨论,设立虚拟头节点dummyHead。
用cur指针遍历链表中的每一个节点,对每一个cur指针指向的位置,用newCur指针从头开始遍历链表寻找cur指针指向的节点的合适的插入位置。由于需要交换节点的位置,我们需要记录cur指针的前一个节点指针pre,以及newCur指针的前一个节点指针newPre。
时间复杂度是O(n ^ 2),其中n为链表中的节点个数。空间复杂度是O(1)。
JAVA代码:
public class Solution {
public ListNode insertionSortList(ListNode head) {
ListNode dummyHead = new ListNode(-1);
dummyHead.next = head;
ListNode pre = dummyHead;
ListNode cur = dummyHead.next;
ListNode newPre = dummyHead;
ListNode newCur = dummyHead.next;
while(cur != null) {
while(newCur != cur && newCur.val < cur.val) {
newPre = newPre.next;
newCur = newCur.next;
}
if(newCur != cur) {
ListNode nextCur = cur.next;
newPre.next = cur;
cur.next = newCur;
pre.next = nextCur;
cur = nextCur;
}else {
pre = pre.next;
cur = cur.next;
}
newPre = dummyHead;
newCur = dummyHead.next;
}
return dummyHead.next;
}
}
LeetCode解题报告: