归并排序【合并两个已排序的链表 a
和 b
】
mergeSort
函数用于合并两个已排序的链表 a
和 b
。首先,它创建一个新的头节点 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
,接受两个参数a
和b
,它们都是指向ListNode
的指针,分别代表两个已排序的链表。
创建新链表
ListNode* head = new ListNode();
ListNode* tail = head;
head
是一个新创建的节点,用作合并链表的起始节点。tail
用于追踪当前合并链表的最后一个节点,初始时它指向head
。
开始合并
while (a || b) {
while
循环会在a
或b
中至少有一个链表未遍历完时继续执行。
判断节点
-
处理链表
b
为NULL
的情况if (a == NULL) { tail->next = b; break; }
- 如果链表
a
遍历完了(即a == NULL
),那么将b
剩下的部分连接到合并链表的尾部,并终止循环。
- 如果链表
-
处理链表
a
为NULL
的情况else if (b == NULL) { tail->next = a; break; }
- 如果链表
b
遍历完了(即b == NULL
),将a
剩下的部分连接到合并链表的尾部,并终止循环。
- 如果链表
-
比较节点值
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