leetcode 链表的插入排序

/**
* Definition for singly-linked list.
*/ struct ListNode {
     int val;
     ListNode *next;
     ListNode(int x) : val(x), next(nullptr) {}
 };
class Solution {
public:
 ListNode *insertionSortList(ListNode *head) {
  if (head == nullptr || head->next == nullptr)
   return head;
  ListNode * pstart = new ListNode(0);//创建一个辅助节点,有利于插入这个节点是头结点
  pstart->next = head;
  //设置一个比较节点
  ListNode *p = head->next;
  //定义一个节点用来指向每次要插入的节点
  ListNode *pend = head;
  while (p != nullptr)
  {
   ListNode * pre = pstart;//因为每次都是从第一个节点开始比较
   ListNode *temp = pstart->next;
   while (p != temp && p->val >= temp->val) //节点只能和该节点之前的节点进行比较
   {
    temp = temp->next;
    pre = pre->next; //这个过程是找到比插入节点大的节点,插入到这个节点前面
   }
   if (p == temp) //如果插入的节点之前的节点都比该节点的值小,那么就进行下一个节点
    pend = temp;
   else{
    /*
    如果找到比这个节点大的节点,进行插入
    */
    pend->next = p->next;
    p->next = temp;
    pre->next = p;
   }
   p = pend->next; //pend节点要一直指向当前插入的节点
  }
  head = pstart->next;
  delete pstart;
  return head;
 }
};

你可能感兴趣的:(leetCode)