大家好,我是开车的阿Q,自动驾驶的时代已经到来,没时间解释了,快和阿Q一起上车。作为自动驾驶系统工程师,必须要有最好的C++基础,让我们来一起刷题吧。
题目考察的知识点
这道题目考察的是链表的合并和排序,需要注意链表的有序性。
题目解答方法的文字分析
我们可以使用合并排序的思想来合并这两个非递增链表。通过比较两个链表的当前节点,逐步选择较大的节点放入新链表中,直到其中一个链表为空。
具体步骤如下:
- 创建一个新链表的头节点
dummy
,以及一个指向新链表当前节点的指针cur
,初始时两者都指向nullptr
。 - 使用一个循环遍历两个链表,比较当前节点的值,选择较大的节点添加到新链表中,并将指针移动到下一个节点。
- 循环结束后,可能其中一个链表还没有遍历完,将剩余的节点连接到新链表的末尾。
- 返回新链表的头节点
dummy->next
,即为结果链表。
本题解析所用的编程语言
C++
完整且正确的编程代码
/** * struct ListNode { * int val; * struct ListNode *next; * ListNode(int x) : val(x), next(nullptr) {} * }; */ class Solution { public: ListNode* mergeEnergyValues(ListNode* l1, ListNode* l2) { ListNode* dummy = new ListNode(-1); // 创建一个虚拟头节点 ListNode* cur = dummy; // 当前节点指针 // 合并排序 while (l1 && l2) { if (l1->val >= l2->val) { cur->next = l1; l1 = l1->next; } else { cur->next = l2; l2 = l2->next; } cur = cur->next; } // 连接剩余的节点 if (l1) cur->next = l1; if (l2) cur->next = l2; return dummy->next; // 返回新链表的头节点 } };
这个代码使用合并排序的思想,通过遍历两个非递增链表,比较当前节点的值并选择较大的节点添加到新链表中。最后,将剩余的节点连接到新链表的末尾,得到合并后的非递增链表。