首页 > 代码库 > LeetCode :: Insertion Sort List [详细分析]
LeetCode :: Insertion Sort List [详细分析]
Sort a linked list using insertion sort.
仍然是一个非常简洁的题目,让我们用插入排序给链表排序;这里说到插入排序,可以来回顾一下, 最基本的入门排序算法,就是插入排序了;时间复杂度为n^2,最基本的插入排序是基于数组实现的,下面给出基于数组实现的插入排序,来体会一个插入排序的思想;
以下仅为数组实现,不是解题代码,没兴趣可以跳过。
void insertionsort (int a[], int N) { for (int i = 1; i < N; i++){ int tmp = a[i]; for (int j = i; j >= 0 && a[j] < a[j - 1]; j--) //这里是升序排列,所以是a[j] < a[j - 1] a[j] = a[j - 1]; a[j] = tmp; } }
当做链表的时候,有两点主要区别:一、由于是单向链表,所以和数组不同的是,每一次都从第一个节点向后扫描,寻找合适的插入位置;当然,数组也是可以这样的;
二、数组需要挨个替换,我上面的写法在寻找合适位置的同时就直接替换了,所以感觉没那么明显,而链表则是在需找到合适位置之后,把待排序节点拿出插入其中,体现了链表的动态性。
/** * 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) { if (head == NULL || head->next == NULL) return head; ListNode *tmp = NULL; ListNode *pre_tmp = NULL; ListNode *dummy = new ListNode(0); ListNode *pos = head->next; //这里用pos指向第一待插入排序数据 ListNode *pre_pos = head; dummy->next = head; while(pos != NULL){ tmp = dummy->next; //这里一开始写成了 tmp = head 一直错,太不细心了!在引入哑节点之后, //这里就不能等于head,只有这样才可以从第一个开始扫描开始扫描。 pre_tmp = dummy; while(tmp->val < pos->val && tmp != pos){ //第二个条件在数组插入排序时事不用判断的,这里需要注意! pre_tmp = tmp; tmp = tmp->next; } if (tmp != pos) { pre_pos->next = pos->next; pre_tmp->next = pos; pos->next = tmp; pos = pre_pos; } pre_pos = pos; pos = pos->next; } return dummy->next; } };
PS:dummy节点对于头节点可能变化的链表来说,引入是一个很方便的事情,但是要记得链表的起始用dummy->next表示而不要用head,因为head指向的那个节点由于变动,可能就不是头节点了 orz
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。