题解 | 合并两个排序的链表
/** * 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类 */ ListNode* Merge(ListNode* pHead1, ListNode* pHead2) { // write code here // nullptr if (pHead1 == nullptr && pHead2 == nullptr) { return nullptr; } if (pHead1 == nullptr) { return pHead2; } if (pHead2 == nullptr) { return pHead1; } ListNode* curr1 = pHead1; ListNode* curr2 = pHead2; ListNode* jointHead = new ListNode(0); ListNode* curr = jointHead; // if (pHead1->val > pHead2->val){ // jointHead = pHead1; // prev = jointHead; // } else { // jointHead = pHead2; // prev = jointHead; // } while (curr1 != nullptr || curr2 != nullptr) { if (curr1 == nullptr) { curr->next = curr2; break; } else if (curr2 == nullptr) { curr->next = curr1; break; } if (curr1->val <= curr2->val) { curr->next = curr1; curr1 = curr1->next; } else { curr->next = curr2; curr2 = curr2->next; } curr = curr->next; } return jointHead->next; //一个已经为空了,直接返回另一个 // if(pHead1 == NULL) // return pHead2; // if(pHead2 == NULL) // return pHead1; // //加一个表头 // ListNode* head = new ListNode(0); // ListNode* cur = head; // //两个链表都要不为空 // while(pHead1 && pHead2){ // //取较小值的节点 // if(pHead1->val <= pHead2->val){ // cur->next = pHead1; // //只移动取值的指针 // pHead1 = pHead1->next; // }else{ // cur->next = pHead2; // //只移动取值的指针 // pHead2 = pHead2->next; // } // //指针后移 // cur = cur->next; // } // //哪个链表还有剩,直接连在后面 // if(pHead1) // cur->next = pHead1; // else // cur->next = pHead2; // //返回值去掉表头 // return head->next; } };
注意:需要单独的维护一个指针是用作输出的链表的索引指针,并且需要有另外两个指针去维护待链接的子链表的相关索引#剑指offer#