具体思路同LeetCode-21。
1、迭代逐位比较
我们逐位比较list1和list2中元素的大小,而后将较小的元素加入新的链表当中。当其中一个链表为空时,我们将另一个链表中的所有元素都加入新链表中。
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode* preHead = new ListNode(-1);
ListNode* prev = preHead;
while (l1 != nullptr && l2 != nullptr) {
if (l1->val < l2->val) {
prev->next = l1;
l1 = l1->next;
} else {
prev->next = l2;
l2 = l2->next;
}
prev = prev->next;
}
prev->next = l1 == nullptr ? l2 : l1;
return preHead->next;
}
};
2、递归逐位比较
具体思想同上,区别在于递归实现。
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if (l1 == nullptr) {
return l2;
} else if (l2 == nullptr) {
return l1;
} else if (l1->val < l2->val) {
l1->next = mergeTwoLists(l1->next, l2);
return l1;
} else {
l2->next = mergeTwoLists(l1, l2->next);
return l2;
}
}
};
3、指向指针的指针
使用指向指针的指针pp来记录l1或l2指针本身,这样子cur->next记录的就会是指针本身,这样子我们继续移动指针进行比较即可。当最终有一个链表不为空时,则将整个链表接到结果上。
值得注意的是,这里使用*pp进行移动,避免了对到底移动l1还是l2进行讨论,从而进一步优化了代码。
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode* dummy = new ListNode(0);
ListNode* cur = dummy;
while (l1 != nullptr && l2 != nullptr) {
ListNode** pp = (l1->val < l2->val) ? &l1 : &l2;
cur->next = *pp;
cur = cur->next;
*pp = (*pp)->next;
}
cur->next = (l1 == nullptr) ? l2 : l1;
ListNode* ans = dummy->next;
delete dummy;
return ans;
}
};