147.对链表进行插入排序
题目
![](https://img-blog.csdnimg.cn/img_convert/19ef0e9e9379eb5beacbb74818557a63.png)
![](https://img-blog.csdnimg.cn/img_convert/448a72bf41ceb273ece3bb324f1d026c.png)
题解
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* insertionSortList(struct ListNode* head){
//sorted表示已经排序的结点序列的最后一个。
struct ListNode* sorted = head;
while(sorted->next != NULL){
if(sorted->next->val >= sorted->val){ //待排序的第一个元素值大于已排序最后一个,直接纳入
sorted = sorted->next;
}else{
struct ListNode* temp = sorted->next; //先取出本轮插入的结点。
sorted->next = sorted->next->next;
if(temp->val < head->val){ //待插入节点值小于头结点,取代头结点。
temp->next = head;
head = temp;
}else{
struct ListNode* search = head; //待插入值大于头结点,小于已排序最后一个结点,在已排序序列中寻找插入位置。
while(search->next->val < temp->val){
search = search->next;
}
temp->next = search->next;
search->next = temp;
}
}
}
return head;
}
![](https://img-blog.csdnimg.cn/img_convert/293dcbde32fba48e73026b70ae0f7a67.png)
要点
没什么好说的,掌握插入排序。
1669.合并两个链表
题目
![](https://img-blog.csdnimg.cn/img_convert/66ad5f5c18918f6df7d1d13d7291b91e.png)
![](https://img-blog.csdnimg.cn/img_convert/a96acc7bf72e3b82706c26ed17778cf0.png)
题解
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* mergeInBetween(struct ListNode* list1, int a, int b, struct ListNode* list2){
struct ListNode* list2end = list2;
while(list2end->next != NULL){
list2end = list2end->next;
}
struct ListNode* list1temp = list1;
for(int i = 0;i <= b;i++){
if(i == a-1){
struct ListNode* temp = list1temp->next;
list1temp->next = list2;
list1temp = temp;
}else if(i == b){
list2end->next = list1temp->next;
}else{
list1temp = list1temp->next;
}
}
return list1;
}
要点
无