Solution 1
插入排序本身没有什么难度,但是我卡在了如何处理最后一个节点的next,最后插入一个flag标记有序序列位置,并对其next及时修改。(这个题很适合面试啊)
- 时间复杂度: O ( N 2 ) O(N^2) O(N2),其中 N N N是节点个数,插入排序的二次复杂度
- 空间复杂度: O ( 1 ) O(1) O(1),仅维护常数个状态量
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* insertionSortList(ListNode* head) {
auto tempHead = new ListNode();
tempHead->next = head;
auto sorted = head; // 默认第一个有顺序
auto cur = head->next;
while (cur != nullptr) {
if (sorted->val <= cur->val) {
sorted = sorted->next; // 发现更大的,标签移位
} else {
auto prev = tempHead;
while (prev->next->val <= cur->val) {
prev = prev->next;
}
sorted->next = cur->next;
cur->next = prev->next;
prev->next = cur;
}
cur = sorted->next;
}
return tempHead->next;
}
};
Solution 2
Solution 1的Python实现
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def insertionSortList(self, head: Optional[ListNode]) -> Optional[ListNode]:
tempHead = ListNode()
tempHead.next = head
flag = head
cur = head.next
while cur is not None:
if flag.val <= cur.val:
flag = flag.next
else:
prev = tempHead
while prev.next.val <= cur.val: prev = prev.next
flag.next = cur.next
cur.next = prev.next
prev.next = cur
cur = flag.next
return tempHead.next