题目描述
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
解决思路
这道题重在对于问题的分析和理解。
我们函数是得到了两个头节点的指针。
我们需要定义一个合并后的链表头节点,然后比较两个链表头节点的值,其中值更小的节点作为合并链表头节点的下一个节点。
值更大的那个节点与值更小的那个节点的下一节点继续放入函数判断并决定哪一个节点要继续链接到我们的合并链表中。
显然可以用递归进行实现。
思路一:递归实现
//运行时间:4ms
//运行内存:488K
/*
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;
else if(pHead2==nullptr)
return pHead1;
ListNode* pMergeHead = nullptr;
if(pHead1->val > pHead2->val)
{
pMergeHead = pHead2;
pMergeHead->next = Merge(pHead1,pHead2->next);
}
else
{
pMergeHead = pHead1;
pMergeHead->next = Merge(pHead2,pHead1->next);
}
return pMergeHead;
}
};
思路二:非递归实现
非递归实现比较复杂,这里就不再赘述,有兴趣的朋友不妨尝试一下。
小结
1.这道题的关键是要头脑清晰,抓住关键。把握递归结构。
2.注意代码的鲁棒性。防止程序去访问空指针,否则会崩溃。
这里如果1是空指针,合并的结果就是2。如果2是空指针,合并的结果就是1。
参考文献
《剑指offer》
牛课网刷题链接link.