题解 | #合并两个排序的链表#
合并两个排序的链表
https://www.nowcoder.com/practice/d8b6b4358f774294a89de2a6ac4d9337
(递归解题思路来自剑指offer,思路真的巧妙,以前自己做的都是迭代,边界条件需要注意的多一点)
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2) {
if (pHead1 == nullptr) return pHead2;
if (pHead2 == nullptr) return pHead1;
ListNode* pRes = nullptr;
if (pHead1->val < pHead2->val) {
pRes = pHead1;
pRes->next = Merge(pHead1->next, pHead2);
}
else {
pRes = pHead2;
pRes->next = Merge(pHead1, pHead2->next);
}
return pRes;
}
};
迭代解法
class Solution {
public:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2) {
if (pHead1 == NULL) return pHead2;
if (pHead2 == NULL) return pHead1;
ListNode* p1 = pHead1;
ListNode* p2 = pHead2;
ListNode* res = p1->val > p2->val ? pHead2 : pHead1;
ListNode* p3 = res;
if (res == pHead1) {
p1 = p1->next;
}
if (res == pHead2) {
p2 = p2->next;
}
while (p1 && p2) {
if (p1->val <= p2->val) {
p3->next = p1;
p3 = p1;
p1 = p1->next;
} else if (p1->val > p2->val) {
p3->next = p2;
p3 = p2;
p2 = p2->next;
}
}
p3->next = p1 ? p1 : p2;
return res;
}
};
2023 剑指-链表 文章被收录于专栏
2023 剑指-链表
查看8道真题和解析