您的位置:首页 > Web前端

剑指offer(16)—合并两个排序的链表

2017-08-27 00:40 323 查看

合并两个排序的链表

题目描述

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

思路

参照归并排序的思想

代码

迭代法:

/*
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 == NULL)
return pHead2;
if(pHead2 == NULL)
return pHead1;
ListNode* p1 = pHead1;
ListNode* p2 = pHead2;
ListNode *pHeadNew, *pcur;
if(p1->val < p2->val){  //新链表的头结点为两个链表头结点中的较小值
pHeadNew = p1;
p1 = p1->next;
}else{
pHeadNew = p2;
p2 = p2->next;
}
pcur = pHeadNew;    //不断加入的当前结点
while(p1!=NULL && p2!=NULL){
if(p1->val < p2->val){  //若p1值小于p2值,则取p1,并将其向后移
pcur->next = p1;
p1 = p1->next;
}else{
pcur->next = p2;
p2 = p2->next;
}
pcur = pcur->next;
}
if(p1!=NULL){   //链表1还有剩余部分,则依次加入
pcur->next = p1;
p1 = p1->next;
pcur = pcur->next;
}
if(p2!=NULL){   //链表2还有剩余部分,则依次加入
pcur->next = p2;
p2 = p2->next;
pcur = pcur->next;
}
return pHeadNew;
}
};


递归法:

/*
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 == NULL)
return pHead2;
if(pHead2 == NULL)
return pHead1;
ListNode* p1 = pHead1;
ListNode* p2 = pHead2;
ListNode *pHeadNew, *pcur;
if(p1->val < p2->val){  //新链表的头结点为两个链表头结点中的较小值
pHeadNew = p1;
p1 = p1->next;
}else{
pHeadNew = p2;
p2 = p2->next;
}
pHeadNew->next = Merge(p1, p2);
return pHeadNew;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: