原题
对链表进行插入排序。
插入排序的动画演示如上。从第一个元素开始,该链表可以被认为已经部分排序(用黑色表示)。
每次迭代时,从输入数据中移除一个元素(用红色表示),并原地将其插入到已排好序的链表中。
插入排序算法:
- 插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。
- 每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。
- 重复直到所有输入数据插入完为止。
示例 1:
输入: 4->2->1->3
输出: 1->2->3->4示例 2:
输入: -1->5->3->4->0
输出: -1->0->3->4->5来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/insertion-sort-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解
这个题竟然翻车了,做了好久。其实并不难,过程记录下来。思路就按照题目给的 gif 来就行了。
思路
- 声明一个只有头结点的链表,记录排序后的新链表,声明两个新的指针 p 指向新链表的头,q 原节点的头。
- 原链表头指针往后移动一位。
- 如果
p->next && head->val > p->next->val
说明新链表的下一个节点小于原链表当前的头节点,说明 p->next 不是合适的插入位置, 我们要把 p 指针向后移动一位,因为链表的拼接就是键的断裂,重连,所以这段代码就应该是这样的,向让 q 指向 p 的下一个节点,然后再把 p 的下一个节点指向q 就好了q->next = p->next, p->next = q;
重复这段过程即可。 - 当原链表的头指针指向最后一个元素时,说明链表排序完了。
附上 gif 演示动图:
代码
- C++代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* insertionSortList(ListNode* head) {
ListNode *ans = new ListNode(-1);
while (head) {
ListNode *p = ans;
while (p->next && p->next->val < head->val) {
p = p->next;
}
ListNode *q = head;
head = head->next;
q->next = p->next;
p->next = q;
}
return ans->next;
}
};
- Python代码
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def insertionSortList(self, head: ListNode) -> ListNode:
ans = ListNode(-1)
while head:
p = ans
while p.next and p.next.val < head.val:
p = p.next
q = head
head = head.next
q.next = p.next
p.next = q
return ans.next
总结
好像执行的速度有点慢,我们遍历原链表的时候,要是原链表当前节点值小于下一个结点的值,就移动原链表的头指针。
参考:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def insertionSortList(self, head: ListNode) -> ListNode:
ans = ListNode(0)
ans.next = head
while head and head.next:
if head.val <= head.next.val:
head = head.next
continue
p = ans
while p.next.val < head.next.val:
p = p.next
q = head.next
head.next = q.next
q.next = p.next
p.next = q
return ans.next