归并排序【链表】

归并排序【合并两个已排序的链表 ab

mergeSort 函数用于合并两个已排序的链表 ab。首先,它创建一个新的头节点 head 和一个尾节点 tail,用于构建合并后的链表。在 while 循环中,它逐个比较两个链表的节点值,将较小的节点连接到合并链表的尾部。当其中一个链表遍历完时,直接将另一个链表的剩余部分连接到合并链表上。最后,返回合并后链表的头节点。

    ListNode* mergeSort(ListNode*a, ListNode* b){
        ListNode* head = new ListNode();
        ListNode* tail = head;
        while(a||b){
            if(a == NULL){
                tail->next = b;
                break;
            }else if(b == NULL){
                tail->next = a;
                break;
            }else if(a->val < b->val){
                tail->next = a;
                a = a->next;
            }else{
                tail->next = b;
                b = b->next;
            }
            tail = tail->next;
            tail->next = NULL;
        }
        return head->next;
    }  

详细解释 mergeSort 函数的每个部分及其逻辑。

函数定义

ListNode* mergeSort(ListNode* a, ListNode* b)
  • 函数名为 mergeSort,接受两个参数 ab,它们都是指向 ListNode 的指针,分别代表两个已排序的链表。

创建新链表

ListNode* head = new ListNode();
ListNode* tail = head;
  • head 是一个新创建的节点,用作合并链表的起始节点。tail 用于追踪当前合并链表的最后一个节点,初始时它指向 head

开始合并

while (a || b) {
  • while 循环会在 ab 中至少有一个链表未遍历完时继续执行。

判断节点

  1. 处理链表 bNULL 的情况

    if (a == NULL) {
        tail->next = b;
        break;
    }
    
    • 如果链表 a 遍历完了(即 a == NULL),那么将 b 剩下的部分连接到合并链表的尾部,并终止循环。
  2. 处理链表 aNULL 的情况

    else if (b == NULL) {
        tail->next = a;
        break;
    }
    
    • 如果链表 b 遍历完了(即 b == NULL),将 a 剩下的部分连接到合并链表的尾部,并终止循环。
  3. 比较节点值

    else if (a->val < b->val) {
        tail->next = a;
        a = a->next;
    } else {
        tail->next = b;
        b = b->next;
    }
    
    • 如果当前 a 的值小于 b 的值,将 a 当前节点连接到合并链表的尾部,并将 a 指向下一个节点。
    • 否则,将 b 当前节点连接到合并链表的尾部,并将 b 指向下一个节点。

更新尾节点

tail = tail->next;
tail->next = NULL;
  • tail 更新为当前合并链表的最后一个节点,并将它的 next 指针设置为 NULL

返回合并链表

return head->next;
  • 最后,返回合并链表的头节点(head->next),因为 head 是一个虚拟节点,不是合并链表的实际头节点。

总结

这个函数通过逐个比较两个已排序链表中的节点,创建一个新的合并链表。它有效地处理了链表为空的情况,确保所有节点都被正确连接,并返回合并后的结果。

归并排序【单个链表排序】

链接:https://blog.youkuaiyun.com/m0_71250630/article/details/142661502

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值