zoukankan      html  css  js  c++  java
  • 【leetcode】147. Insertion Sort List

    题目说明

    https://leetcode-cn.com/problems/insertion-sort-list/description/
    对链表进行插入排序。
    从第一个元素开始,该链表可以被认为已经部分排序。每次迭代时,从输入数据中移除一个元素,并原地将其插入到已排好序的链表中。

    解法1

    遍历链表,每个结点i都与前面的结点进行比较,若大于i结点,则将i结点插入到该点前面

    /*
     * 时间复杂度:O(n^2)
     * 遍历链表,每个结点i都与前面的结点进行比较,若大于i结点,则将i结点插入到该点前面
     */
    ListNode* insertionSortList(ListNode* head) {
        ListNode *dummy = new ListNode(0);
        dummy->next = head;
    
        ListNode *pre = dummy;
        ListNode *cur = NULL;
        ListNode *next = NULL;
        ListNode *tmp = NULL;
        int flag = 0;
    
        while(pre->next){
            cur = pre->next;
            tmp = dummy;
            flag = 0;
            //从dummy->next开始遍历直到cur,找到第一个大于cur的结点
            while(tmp->next != cur){
                if (tmp->next->val > cur->val){
                    next = tmp->next;
                    tmp->next = cur;
                    pre->next = cur->next;
                    cur->next = next;
                    flag = 1;
                    break;
                }
                tmp = tmp->next;
            }
            //没有找到,则直到后移一位
            if (!flag){
                pre = pre->next;
            }
        }
        return dummy->next;
    }
    

    解法2

    对以上方法作了一些调整,基本思路一致。

    /*
     * 时间复杂度:O(n^2)
     * 遍历链表,如果当前结点i的值比后一个结点的值大,则需要排序
     * 从头结点开始遍历,找到第一个大于i结点的结点,将i结点插入到该点之前
     */
    ListNode* insertionSortList(ListNode* head) {
        ListNode *dummy = new ListNode(0);
        dummy->next = head;
    
        ListNode *cur = head;
        ListNode *tmp = NULL;
        ListNode *findNode = NULL;
        ListNode *insertNode = NULL;
    
        while(cur){
            //当前结点的值比后一个结点的值大,则需要排序
            if (cur->next && cur->next->val < cur->val){
                insertNode = cur->next;
                findNode = dummy;
                //遍历链表,找到第一个大于目标结点的结点
                while(findNode->next && findNode->next->val < insertNode->val)
                    findNode = findNode->next;
                //将目标结点插入到该点之前
                tmp = findNode->next;
                findNode->next = insertNode;
                cur->next = insertNode->next;
                insertNode->next = tmp;
            } else
                cur = cur->next;
        }
        return dummy->next;
    }
  • 相关阅读:
    .Net常见面试题整理(一)——值类型和引用类型
    c#字符串常见操作
    sealed,new,virtual,abstract与override
    c#好的程序员必须掌握的编码习惯
    c#区分传值调用 传引用调用。
    C# const和readonly的区别
    .Net常见面试题整理(二)——装箱和拆箱
    C#Equals()和运算符==的区别
    private,protected,public和internal的区别
    2013应届毕业生“数码视讯”校招应聘总结
  • 原文地址:https://www.cnblogs.com/JesseTsou/p/9588674.html
Copyright © 2011-2022 走看看