1. 程式人生 > >ACM-單向鏈表插入排序算法(在原鏈表上操作)

ACM-單向鏈表插入排序算法(在原鏈表上操作)

鏈表插入 lis urn else nod listnode 下一個 class ont

鏈接:https://www.nowcoder.com/questionTerminal/152bc6c5b14149e49bf5d8c46f53152b?toCommentId=1610886
來源:牛客網

/*
1.若鏈表只有一個節點或者為空,直接返回
2.將鏈表的前兩個節點排序,並將排序之後的第二個節點的下一個節點賦空
3.此時整個鏈表分為了兩個,將未排序的節點一一插入到已排序鏈表中:
  3.1.第一種情況,待插入節點比排序鏈表的頭節點小
  3.2.第二種情況,待插入節點比排序鏈表的最後節點大
  3.3.第三種情況,待插入節點可插入到排序鏈表中
*/
 
class Solution {
public
: ListNode *insertionSortList(ListNode *head) { //輸入為空或者只有一個節點 if(!head || !head->next)return head; ListNode *unSortCur = head->next->next; if(head->val > head->next->val) { ListNode *p = head; head = head->next; head
->next = p; p->next = nullptr; } else head->next->next = nullptr; while(unSortCur != nullptr) //QQQ { ListNode *sortPre = head; ListNode *sortCur = sortPre->next; ListNode *unSortNext = unSortCur->next;
if(unSortCur->val < head->val) { unSortCur->next = head; head = unSortCur; } else{ while(sortCur != nullptr && unSortCur->val > sortCur->val) { sortCur = sortCur->next; sortPre = sortPre->next; } if(sortCur == nullptr){ sortPre->next = unSortCur; unSortCur->next = nullptr; } else{ sortPre->next = unSortCur; unSortCur->next = sortCur; } } unSortCur = unSortNext; } return head; } };

ACM-單向鏈表插入排序算法(在原鏈表上操作)