对链表进行插入排序
147. 对链表进行插入排序 - 力扣(LeetCode)
通常的办法:
/*** 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) {ListNode* pre1=nullptr;ListNode* pre2=nullptr;ListNode* cur=head;ListNode* first = head;ListNode* tmp=nullptr;while(cur){if(cur==head){pre1=cur;cur=cur->next;continue;}tmp=first;while(tmp!=cur && tmp->val<= cur->val){pre2=tmp;tmp=tmp->next;}if(tmp->val>cur->val){pre1->next = cur->next;if(pre2)pre2->next=cur;elsefirst=cur;cur->next=tmp;cur=pre1->next;}else{pre1=cur;cur=cur->next;}pre2=nullptr;}return first;}
};
指针非常多,每次需要判断,很麻烦。接下来使用一个虚拟头节点方法,再把队伍分成排列好的和未排列的:
/*** 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) {if (!head || !head->next) return head;ListNode prev(-5001);prev.next=head;ListNode* lastSorted=head;ListNode* cur=head->next;while(cur){if(lastSorted->val<=cur->val){lastSorted=cur;cur=cur->next;}//查找插入位置else{ListNode* pre=&prev;while(pre->next->val <= cur->val)pre=pre->next;lastSorted->next=cur->next;cur->next= pre->next;pre->next = cur;cur=lastSorted->next;}}return prev.next;}
};
需要注意的一个点是:if(lastSorted->val<=cur->val)与while(pre->next->val <= cur->val),一般都要带等于,保持前后相对顺序一致,如果不等于,那么这两部分都要不等于,否则会出现逻辑错误。