剑指Offer面试题25 合并两个排序链表
2018-12-25 本文已影响0人
Yue_Q
题目描述
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
ListNode *pHead3 = new ListNode(3);
if(!pHead1 && !pHead2) return NULL;
ListNode *p1 = pHead1;
ListNode *p2 = pHead2;
if(!p1) return pHead2;
if(!p2) return pHead1;
ListNode *p3 = pHead3;
while(p1 || p2){
if(p1->val < p2->val){
p3->next = p1;
p1 = p1->next;
}else{
p3->next = p2;
p2 = p2->next;
}
p3 = p3->next;
if(!p1) {
p3->next = p2;
break;
}
if(!p2){
p3->next = p1;
break;
}
}
return pHead3->next;
}
};
思路:
- 使用p1,p2分别指向pHead1,pHead2,在使用p3指向pHead3。
- 判断 p1,p2 较小指向的值,将它放在 p3 后面,然后依次移动指针
解法二
/*
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) return pHead2;
if(!pHead2) return pHead1;
if(pHead1->val < pHead2->val){
pHead1->next = Merge(pHead1->next,pHead2);
return pHead1;
}else{
pHead2->next = Merge(pHead1,pHead2->next);
return pHead2;
}
}
};
思路:
- 如果 pHead1 等于空,返回 pHead2。pHead2 同理
- 比较它们的值,返回值小的节点,下一个节点进入递归。