合并两个排序的链表
题目描述
描述
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
示例1
输入:
{1,3,5},{2,4,6}
返回值:
{1,2,3,4,5,6}
两个思路
1.递归方法(个人感觉比较好理解)
把 pHead1 与 pHead2之间的问题转换成比较两个节点对应的位置的值的大小问题,直接看代码:
class Solution {
public:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2) {
ListNode* s1= pHead1;
ListNode* s2= pHead2;
if(s1==nullptr) return s2;
if(s2==nullptr) return s1;
if(s1==nullptr&&s2==nullptr) return nullptr;//虽然加了,但是好像有点多余
if(s1->val<=s2->val){
s1->next=Merge(s1->next, s2);//直接转换成s1->next,s2之间的问题,递归好神奇哈哈
return s1;
}else{
s2->next=Merge(s1,s2->next);
return s2;
}
}
};
2.迭代方法
这里就是设置一个单链表,然后在单链表首部设置一个虚拟头结点,充当哨兵节点,这样每个节点都有前驱节点啦~
class Solution {
public:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
ListNode *vhead = new ListNode(0);
ListNode *cur = vhead;
while (pHead1 && pHead2) { //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;//剩最后一个节点
return vhead->next;
}
};
后记:
最大的感想是,果然刷剑指offer之前应该先复习一下STL的,不然代码都记不住怎么写