• 9. Sort List && Insertion Sort List (链表排序总结)


    Sort List

              

    Sort a linked list in O(n log n) time using constant space complexity.

    说明:归并排序: 时间 O(nlogn),空间 O(1). 每次将链表一分为二, 然后再合并。快排(用两个指针)
    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
     
    ListNode* getMid(ListNode *head) {
        ListNode *first, *second, *preFirst;
        preFirst = first = second = head;
        while(second != NULL) {
            preFirst = first;
            first = first->next;
            if(second->next == NULL) break;
            second = second->next->next;
        }
        preFirst->next = NULL;
        return first;
    }
    
    void Merge(ListNode *head1, ListNode *head2) {
        if(head1->val > head2->val) {
    		int tem = head1->val;
    		head1->val = head2->val;
    		head2->val = tem;
    	}
        ListNode *p = head1;
        while(p->next != NULL && head2 != NULL) {
            if(p->next->val >= head2->val) {
                ListNode *q = p->next;
                p->next = head2;
                head2 = head2->next;
                p->next->next = q;
                p = p->next;
            } else {
                p = p->next;
            }
        }
        if(head2 != NULL)
            p->next = head2;
    }
     
    void MergeSort(ListNode *head) {
        if(head == NULL || head->next == NULL) return;
        ListNode *mid = getMid(head);
    	MergeSort(head);
    	MergeSort(mid);
        Merge(head, mid);
    }
     
    class Solution {
    public:
        ListNode *sortList(ListNode *head) {
           MergeSort(head);
           return head;
        }
    };
    

    Insertion Sort List

              

    Sort a linked list using insertion sort.

    说明: 与顺序表不同的时,每次找插入位置时从头开始走。

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        ListNode *insertionSortList(ListNode *head) {
            ListNode *p, *q;
            for(q = head; q != NULL; q = q->next) {
                for(p = head; p != q; p = p->next) {
                    if(p->val >= q->val) {
                        int tem = p->val;
                        p->val = q->val;
                        q->val = tem;
                    }
                }
            }
            return head;
        }
    };
    
     
     
  • 相关阅读:
    对于“机器视觉(computer version)”的反思
    图像视觉的调试
    对自主标定的实现
    使用dll,将image库开放出去
    使用liner、feather、multiband对已经拼接的数据进行融合(下)
    使用liner、feather、multiband对已经拼接的数据进行融合
    模版多匹配
    Metasploit AFP爆破模块afp_login
    SQLite中SELECT基本形式
    Nmap 7.70新增功能——扫描主机所有IP
  • 原文地址:https://www.cnblogs.com/liyangguang1988/p/3902268.html
Copyright © 2020-2023  润新知