考察的知识点:遍历链表、修改节点的指针指向;
解答方法分析:
- 首先,创建一个虚拟头节点(dummy),并创建一个指针
curr
指向虚拟头节点。 - 使用
while
循环遍历两个链表l1
和l2
,当两个链表都不为空时执行循环体。 - 在循环体中,比较
l1
和l2
当前节点的值大小,将较小的节点接入新链表中,并将对应链表的指针后移。 - 将
curr
指针后移,指向新链表的最后一个节点。 - 当循环结束时,至少有一个链表为空。将剩余的节点连接到新链表的末尾。
- 返回虚拟头节点(dummy)的下一个节点,即为合并后的有序链表的头节点。
所用编程语言:C++;
完整编程代码:↓
/** * struct ListNode { * int val; * struct ListNode *next; * ListNode(int x) : val(x), next(nullptr) {} * }; */ class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param l1 ListNode类 * @param l2 ListNode类 * @return ListNode类 */ ListNode* mergeEnergyValues(ListNode* l1, ListNode* l2) { ListNode* dummy = new ListNode(0); // 创建虚拟头节点 ListNode* curr = dummy; // 当前指针 while (l1 != nullptr && l2 != nullptr) { if (l1->val > l2->val) { curr->next = l1; // 将l1节点接入新链表 l1 = l1->next; // 指针后移 } else { curr->next = l2; // 将l2节点接入新链表 l2 = l2->next; // 指针后移 } curr = curr->next; // 新链表指针后移 } // 处理剩余的节点 if (l1 != nullptr) { curr->next = l1; } if (l2 != nullptr) { curr->next = l2; } return dummy->next; // 返回新链表的头节点 } };