[LeetCode]147 链表插入排序

Insertion Sort List(链表插入排序)

【难度:Medium】
Sort a linked list using insertion sort.
对一个链表使用插入排序。


解题思路

基于插入排序的思想,从链表头开始遍历,找到第一个大于当前节点的链表节点,进行链表间的交换操作。由于链表的操作比较麻烦,因此链表的插入排序相比于数组的插入排序要复杂。


c++代码如下:

/**
 * 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 || !head->next)
            return head;
        //虚节点作为新链表头
        ListNode* dummy = new ListNode(INT_MIN);
        //遍历节点
        ListNode* cur = head;
        //cur节点的前一个节点
        ListNode* pre = dummy;
        //cur节点的下一个节点
        ListNode* cur_next = NULL;
        while (cur) {
            //先保留cur的下一个节点
            cur_next = cur->next;
            //pre的下一个节点的值大于cur节点的值
            while (pre->next && pre->next->val < cur->val)
                pre = pre->next;
            //增加新链表中的节点
            cur->next = pre->next;
            pre->next = cur;
            pre = dummy;
            cur = cur_next;
        }
        //去掉虚节点
        return dummy->next;
    }
};

数组的插入排序c++代码如下:

#include<iostream>
#include<vector> 
using namespace std;
void insertSort(vector<int>& array) {
    int n = array.size();
    for (int i = 1; i < n; i++) {
        //找到比前面一个数更小的 
        if (array[i-1] > array[i]) {
            int current = array[i];
            int j = i;
            //找到合适的插入位置
            while (j > 0 && array[j-1] > current) {
                array[j] = array[j-1];
                j--;
            }
            array[j] = current;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值