面试题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 };

 

posted @ 2017-05-19 10:35  wxquare  阅读(354)  评论(0编辑  收藏  举报