Leetcode — 147.对链表进行插入排序

本文详细介绍了如何使用插入排序算法对链表进行排序,包括头插、中间插入和尾插的具体实现步骤,适合理解链表操作和排序算法的读者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:

对链表进行插入排序。
题目链接


算法描述:

插入排序算法:
1.插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。
2.每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。
3.重复直到所有输入数据插入完为止


举例说明:


思路分析:

1.将待排序链表的头拿出,作为新链表的头,然后依次把剩余的结点插入到以这个头为头的新链表中。

2.确定插入位置:从前往后遍历,为当前要插入的结点找到正确的插入位置即可。

  • 第一种情况:头插
    在这里插入图片描述
//头插
if(cur->val<=sortHead->val)
{
	cur->next = sortHead;
	sortHead = cur; 
}
  • 第二种情况:中间插入
    在这里插入图片描述
//中间插入
struct ListNode* sortPrev = sortHead;
struct ListNode* sortCur = sortPrev->next;
while(sortCur!=NULL)
{
	if(cur->val>sortCur->val)
	{
		sortPrev = sortPrev->next;
		sortCur = sortPrev->next;
	}
	else
	{
	//确定位置 插入
		cur->next = sortCur;
		sortPrev->next = cur;    
		break;  
	}
}
  • 第三种情况:尾插
    在这里插入图片描述
//尾插
if(sortCur == NULL)
{
    sortPrev->next = cur;
    cur->next = NULL;
}

代码实现:

struct ListNode* insertionSortList(struct ListNode* head){
    if(head == NULL|| head->next == NULL)
    {
        return head;
    }
    //拿出头作为新链表的头
    struct ListNode* sortHead = head;
    struct ListNode* cur = sortHead->next;
    sortHead->next = NULL;
    while(cur!=NULL)
    {
        struct ListNode* next = cur->next;
        //头插
        if(cur->val<=sortHead->val)
        {
            cur->next = sortHead;
            sortHead = cur; 
        }
        //中间插
        else
        {
            struct ListNode* sortPrev = sortHead;
            struct ListNode* sortCur = sortPrev->next;
            while(sortCur!=NULL)
            {
                if(cur->val>sortCur->val)
                {
                    sortPrev = sortPrev->next;
                    sortCur = sortPrev->next;
                }
                else
                {
                    //确定位置 插入
                    cur->next = sortCur;
                    sortPrev->next = cur;    
                    break;  
                }
            }
            //尾插
            //不是因break跳出
            if(sortCur == NULL)
            {
                sortPrev->next = cur;
                cur->next = NULL;
            }
        }
        cur = next;
    }
    return sortHead;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值