[C/C++] List相关操作

List相关操作

1 链表二分

目标:

(1)对于偶数节点,正好对半分;

(2)对于奇数节点,前 = 后 + 1

(3)断开链表,方便后期合并

cpp 复制代码
// 使用快慢指针完成中点拆分
ListNode *SplitList(ListNode *head) {
    ListNode *slow{head};
    ListNode *fast{head};

    while (fast->next != nullptr && fast->next->next != nullptr) {
        slow = slow->next;
        fast = fast->next->next;
    }

    ListNode *mid = slow->next;
    slow->next = nullptr;
    return mid;
}

2 链表合并

cpp 复制代码
ListNode *MergeList(ListNode *head1, ListNode *head2) {
    ListNode dummy{};
    ListNode *cur = &dummy;

    while (head1 != nullptr && head2 != nullptr) {
        if (head1->val < head2->val) {
            cur->next = head1;
            head1 = head1->next;
        } else {
            cur->next = head2;
            head2 = head2->next;
        }

        cur = cur->next;
    }


    cur->next = (head1 != nullptr) ? head1 : head2;
    return dummy.next;
}

3 链表排序

cpp 复制代码
ListNode* sortList(ListNode* head) {
    // 题目进阶要求 nlgn => 希尔/归并/快速/堆
    if (head == nullptr || head->next == nullptr) {
        return head;
    }

    ListNode *head2 = SplitList(head);

    head = sortList(head);
    head2 = sortList(head2);

    return MergeList(head, head2);
}

4 多链表合并

cpp 复制代码
ListNode* mergeKLists(vector<ListNode*>& lists) {
    auto cmp = [](const ListNode *lhs, const ListNode *rhs) {
        return lhs->val > rhs->val;
    };

	// 通过优先级队列进行排序,并将取出的后续节点继续插入
    priority_queue<ListNode *, vector<ListNode *>, decltype(cmp)> pq{};

    for (auto head : lists) {
        if (head != nullptr) {
            pq.push(head);
        }
    }

    ListNode dummy{};
    ListNode *cur = &dummy;

    while (!pq.empty()) {
        // 取最小
        ListNode *node = pq.top();
        pq.pop();

        if (node->next != nullptr) {
            pq.push(node->next);
        }

        cur->next = node;
        cur = node;
    }

    return dummy.next;
}
相关推荐
故事和你915 小时前
洛谷-数据结构1-1-线性表1
开发语言·数据结构·c++·算法·leetcode·动态规划·图论
脱氧核糖核酸__5 小时前
LeetCode热题100——53.最大子数组和(题解+答案+要点)
数据结构·c++·算法·leetcode
脱氧核糖核酸__6 小时前
LeetCode 热题100——42.接雨水(题目+题解+答案)
数据结构·c++·算法·leetcode
王老师青少年编程7 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【线性扫描贪心】:数列分段 Section I
c++·算法·编程·贪心·csp·信奥赛·线性扫描贪心
王老师青少年编程7 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【线性扫描贪心】:分糖果
c++·算法·贪心算法·csp·信奥赛·线性扫描贪心·分糖果
leaves falling7 小时前
C++模板进阶
开发语言·c++
无敌昊哥战神8 小时前
【保姆级题解】力扣17. 电话号码的字母组合 (回溯算法经典入门) | Python/C/C++多语言详解
c语言·c++·python·算法·leetcode
脱氧核糖核酸__8 小时前
LeetCode热题100——238.除了自身以外数组的乘积(题目+题解+答案)
数据结构·c++·算法·leetcode
ouliten8 小时前
C++笔记:std::invoke
c++·笔记
j_xxx404_9 小时前
C++算法:哈希表(简介|两数之和|判断是否互为字符重排)
数据结构·c++·算法·leetcode·蓝桥杯·力扣·散列表