zoukankan      html  css  js  c++  java
  • 面试题25:单链表排序

    面试中经常会碰到单链表的排序,主要是插入排序和归并排序

    插入排序:

     1 class Solution {
     2 public:
     3     ListNode *insertionSortList(ListNode *head) {
     4         if (head == nullptr) return head;
     5         if (head->next == nullptr) return head;
     6 
     7         ListNode* dummy = new ListNode(-1);
     8         dummy->next = head;
     9 
    10         ListNode* cur = head->next;
    11         ListNode* cur_pre = head;
    12         while (cur) {
    13             ListNode* cur_next = cur->next;
    14             ListNode* p_pre = dummy;
    15             ListNode* p = dummy->next;
    16             while (cur->val >= p->val && p != cur) {
    17                 p_pre = p_pre->next;
    18                 p = p->next;
    19             }
    20             if (p == cur) {
    21                 cur_pre = cur;
    22                 cur = cur->next;
    23             } else {
    24                 p_pre->next = cur;
    25                 cur->next = p;
    26                 cur_pre->next = cur_next;
    27                 cur = cur_next;
    28             }
    29         }
    30         return dummy->next;
    31     }
    32 };

    归并排序:

     1 class Solution {
     2 public:
     3     ListNode *sortList(ListNode *head) {
     4         if(head == nullptr || head->next == nullptr) return head;
     5         ListNode* slow = head;
     6         ListNode* fast = head->next;
     7 
     8         while(fast && fast->next){
     9             slow = slow->next;
    10             fast = fast->next->next;
    11         }
    12         ListNode* head2 = slow->next;
    13         slow->next = nullptr;
    14         ListNode* leftRes = sortList(head);
    15         ListNode* rightRes = sortList(head2);
    16 
    17         return merge(leftRes,rightRes);
    18 
    19     }
    20 
    21     ListNode* merge(ListNode* head1,ListNode* head2){
    22         ListNode* head = new ListNode(-1);
    23         ListNode* p = head;
    24         ListNode* p1 = head1;
    25         ListNode* p2 = head2;
    26         while(p1 && p2){
    27             if(p1->val <= p2->val){
    28                 p->next = p1;
    29                 p1 = p1->next;
    30             }else{
    31                 p->next = p2;
    32                 p2 = p2->next;
    33             }
    34             p = p->next;
    35         }
    36         if(p1) p->next = p1;
    37         if(p2) p->next = p2;
    38         return head->next;
    39     }
    40 };
  • 相关阅读:
    Tomcat
    DOM/SAX/PULL解析XML
    Android网络编程 知识框架
    Chapter 10 Networking/JSON Services
    Chapter 10 Networking/Web Service Using HTTP
    Android-Universal-Image-Loader
    8.Media and Camera/Media Camera
    PAT乙级1007.素数对猜想(20)
    筛法求素数详解
    PAT乙级1006.换个格式输出整数(15)
  • 原文地址:https://www.cnblogs.com/wxquare/p/6877097.html
Copyright © 2011-2022 走看看