leetcode 147.对链表进行插入排序

⭐️ 题目描述

leetcode 147.对链表进行插入排序_第1张图片
leetcode 147.对链表进行插入排序_第2张图片

leetcode链接:对链表进行插入排序

思路与图解:
leetcode 147.对链表进行插入排序_第3张图片
遍历链表,当前结点依次与前面的结点比较,选择插入位置。每次与前面的结点比较需要从头开始比较,所以定义一个 tempHead 指针,在定义一个 tempHeadPrev 指针记录 tempHead 前一个结点位置(方便插入),在定义一个 tail 记录前面区间的尾结点,当插入时需要考虑头插还是中间插入,当当前元素比前面区间元素都大时,说明无需插入当前位置合适,只需要改变 tail 指针(相当于确定新区间),下次继续迭代即可。

1️⃣ 代码:

struct ListNode* insertionSortList(struct ListNode* head){
	// 从第二个结点开始遍历链表
    struct ListNode* cur = head->next;
    // 记录前面区间的尾部
    struct ListNode* tail = head;
    while (cur) {
    	// 记录下遍历的下一个位置
        struct ListNode* next = cur->next;
        // 区间的头部
        struct ListNode* tempHead = head;
        // 区间头部的前一个结点
        struct ListNode* tempHeadPrev = NULL;
        // cur 依次和区间元素进行比较确认插入位置
        while (cur != tempHead && cur->val > tempHead->val) {
            tempHeadPrev = tempHead;
            tempHead = tempHead->next;
        }
        // 如果 cur 比 当前区间所有结点数据都大 更新尾区间
        if (cur == tempHead) {
            tail = cur; 
        }
        else {
        	// 插入
            if (tempHeadPrev == NULL) {
                // 头插入更新头指针
                head = cur;
            } else {
            	// 中间插入
                tempHeadPrev->next = cur;
            }
            tail->next = cur->next;
            cur->next = tempHead;
        }

        // 迭代
        cur = next;
    }

    return head;
}

你可能感兴趣的:(刷题,leetcode,链表,学习)