您的位置:首页 > 其它

合并两个排序链表

2016-03-17 13:59 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* pHead=NULL;
ListNode* pLast=NULL;
ListNode* pStart1=pHead1;
ListNode* pStart2=pHead2;
ListNode* pEnd1 = pHead1;
ListNode* pEnd2 = pHead2;
if(pHead1->val < pHead2->val){
pHead = pHead1;
pLast = pHead;
pStart1=pStart1->next;
pEnd1=pStart1;
}else{
pHead = pHead2;
pLast = pHead;
pStart2 = pStart2->next;
pEnd2 = pStart2;
}
while(pStart1 != NULL && pStart2 != NULL){
if(pStart1->val < pStart2->val){
while(pEnd1->next !=NULL && pEnd1->next->val < pStart2->val){
pEnd1 = pEnd1->next;
}
pLast->next = pStart1;
pLast = pEnd1;
pEnd1 = pEnd1->next;
pStart1 = pEnd1;
}else{
while(pEnd2->next!=NULL && pEnd2->next->val < pStart1->val){
pEnd2 = pEnd2->next;
}
pLast->next = pStart2;
pLast = pEnd2;
pEnd2 = pEnd2->next;
pStart2 = pEnd2;
}
}
if(pStart1 == NULL) {
pLast ->next = pStart2;
}else if(pStart2 == NULL){
pLast->next = pStart1;
}
return pHead;
}
};


一般的解法有两种

一个通过递归来解

再就是通过循环还解

以上的是通过循环还解的,不过在通用的解法基础上做了一些改进 

通常是一个一个节点的比较,比较之后再取小的一个合并,如此重复,直至完成,最后把余下的一个链表全加进去。

上面的是,一段一段的合并,如果 表1 表头比表2小,就再往下找下去,直到一个比表2表头大的那个,然后把这一段加进去。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: