ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { ListNode* dummy = new ListNode(0); ListNode* cur = dummy; while (l1 != nullptr && l2 != nullptr) { ListNode** pp = (l1->val < l2->val) ? &l1 : &l2; cur->next = *pp; cur = cur->next; *pp = (*pp)->next; } cur->next = (l1 == nullptr) ? l2 : l1; ListNode* ans = dummy->next; delete dummy; return ans; }
时间: 2023-11-28 14:47:13 浏览: 139
Q715372 C语言链表排序
这段代码是合并两个有序链表的代码,可以用来将两个有序链表合并成一个有序链表。主要思路是通过比较两个链表的节点的大小,将较小的节点添加到结果链表中,直到其中一个链表为空。最后将另一个链表剩下的节点直接添加到结果链表的末尾即可。
具体解释可以看下面的注释:
```
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode* dummy = new ListNode(0); // 创建一个虚拟头节点
ListNode* cur = dummy; // cur 指向当前节点,初始时指向虚拟头节点
while (l1 != nullptr && l2 != nullptr) { // 当两个链表都非空时
ListNode** pp = (l1->val < l2->val) ? &l1 : &l2; // 找出较小的节点
cur->next = *pp; // 将较小的节点添加到结果链表中
cur = cur->next; // 更新当前节点为新加入的节点
*pp = (*pp)->next; // 将原链表中被添加的节点指针后移
}
cur->next = (l1 == nullptr) ? l2 : l1; // 将另一个非空的链表直接添加到结果链表末尾
ListNode* ans = dummy->next; // 记录结果链表的头节点
delete dummy; // 释放虚拟头节点的内存
return ans; // 返回结果链表的头节点
}
```
阅读全文