/** * struct ListNode { * int val; * struct ListNode *next; * ListNode(int x) : val(x), next(nullptr) {} * }; */ class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param pHead1 ListNode类 * @param pHead2 ListNode类 * @return ListNode类 */ //思路:通过遍历pHead1的节点,满足插入条件则插入pHead2的结点 ListNode* Merge(ListNode* pHead1, ListNode* pHead2) { // write code here if(pHead1 == nullptr && pHead2 == nullptr){ return nullptr; } //如果pHead1 和 pHead2都为空,直接返回空 //{} + {} = {}; if (pHead1 == nullptr ) { return pHead2; } //如果pHead1为空,则直接返回pHead2 //{} + {1, 2, 3} -> {1, 2, 3} if (pHead2 == nullptr ) { return pHead1; } //如果pHead2为空,则直接返回pHead1 //{1, 3} + {} = {1, 3} ListNode* ptr1 = pHead1; ListNode* ptr2 = pHead2; //用ptr1指针遍历pHead1指针, 用ptr2指针遍历pHead2指针 while (ptr1) { //循环条件为ptr1不为空 if (pHead1->val >= pHead2->val) { ptr2 = ptr2->next; pHead2->next = pHead1; pHead1 = pHead2; pHead2 = ptr2; } //如果插入位置在头结点之前,插入节点并更新pHead1头结点的位置 if (ptr1->val <= pHead2->val && !ptr1->next) { ptr1->next = pHead2; return pHead1; } //在pHead1的末尾插入,且ptr1指针的下一个位置为空 //{6} + {7, 8,9} -> {6, 7, 8, 9} if (ptr1->val <= pHead2->val && pHead2->val <= ptr1->next->val && ptr1->next) { ptr2 = ptr2->next; pHead2->next = ptr1->next; ptr1->next = pHead2; pHead2 = ptr2; } //在中间插入节点 if (pHead2 == nullptr) { break; }//pHead2 节点全部插入之后直接推出循环 ptr1 = ptr1->next; //更新ptr1指针 } return pHead1; //返回pHead1 } };