非递归
时间复杂度O(m+n)
空间复杂度O(1)
思路: 如有有一个链表为空,就返回另一个链表。创建一个虚拟头结点连接新的链表,当两个链表都不为空时,循环比较两个链表的头部元素大小,令新链表的下一个结点为值较小的结点,然后相应链表结点后移一位,每次循环完新链表的当前结点也后移一位,循环结束后,令新链表的下一个结点指向剩下的非空链表,返回新链表头部,也就是虚拟头结点的后一个结点。
class Solution {public:ListNode* Merge(ListNode* pHead1, ListNode* pHead2) {// 如果有一个链表为空就返回另外一个链表if (pHead1 == nullptr) return pHead2;if (pHead2 == nullptr) return pHead1;// 创建一个虚拟头结点连接新链表的头部ListNode *dummyNode = new ListNode(0);ListNode *cur = dummyNode;// 当两个链表都不为空时while (pHead1 && pHead2) {// 循环比较两个链表的头部结点元素大小if (pHead1->val <= pHead2->val) {// 令新链表的下一个结点指向值较小的结点cur->next = pHead1;// 然后相应链表结点后移一位pHead1 = pHead1->next;} else {cur->next = pHead2;pHead2 = pHead2->next;}// 每次循环完新链表的当前结点也后移一位cur = cur->next;}// 循环结束后,令新链表的下一个结点指向剩下的非空链表cur->next = pHead1 ? pHead1 : pHead2;ListNode *res = dummyNode->next;delete dummyNode;// 返回新链表头部,也就是虚拟头结点的后一个结点return res;}};
递归
递归调用m+n次
时间复杂度O(m+n):O(1) * (m+n)
// 递归调用的次数和每次的时间复杂度的乘机
空间复杂度O(m+n)
class Solution {public:ListNode* Merge(ListNode* pHead1, ListNode* pHead2) {// 如果有一个链表为空就返回另外一个链表if (!pHead1) return pHead2;if (!pHead2) return pHead1;// 比较两个链表头部结点的值,如果p1头部元素值小// 那么最后返回的就应该是p1头部// 同时将p1的下一个结点指定为递归合并p1后面结点和p2结点后的头部结点if (pHead1->val <= pHead2->val) {pHead1->next = Merge(pHead1->next, pHead2);return pHead1;// 相反如果p2值大于p1// 最后返回的就应是p2的头部结点// p2的下一个结点为p2后面结点和p1所有结点合并后的头部结点} else {pHead2->next = Merge(pHead2->next, pHead1);return pHead2;}}};
