14,合并两个排序链表《剑指offer》

题目:

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

思路:

递归版本:每次只判断当前的两个头结点的大小,执行递归操作,返回较小的头结点;

非递归版本:每次需要循环判断出一个结构:

p1-->p2-->p3 ;

o1-->o2-->o3;

其中

当: p1<o1<o2时 :将p1->next指向o1 然后判断o1和p2 这两个(新的)头结点关系,得到同样的结构;

当:o1<p1<o2时,同样的道理

代码:

//递归版本
/*
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;
        if(pHead1->val<pHead2->val){
            pHead1->next=Merge(pHead1->next,pHead2);
            return pHead1;
        }else{
            pHead2->next=Merge(pHead1,pHead2->next);
            return pHead2;
        }
    }
};

  

//非递归版本:
/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
class Solution {
public:
    ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
    {
        ListNode* tmpNode;
        ListNode* newHead;
        if(pHead1==NULL) return pHead2;
        if(pHead2==NULL) return pHead1;
        if(pHead1->val<pHead2->val){
               newHead=pHead1;
        }else{
               newHead=pHead2;
        }
        
        while(pHead1!=NULL||pHead2!=NULL){
            if(pHead1->val<pHead2->val){
                while(pHead1->next!=NULL&&pHead1->next->val<pHead2->val) pHead1=pHead1->next;
                if(pHead1->next==NULL){
                    pHead1->next=pHead2;
                    break;
                }else{
                    tmpNode=pHead1->next;
                    pHead1->next=pHead2;
                    pHead1=tmpNode;
                }
            }else{
                while(pHead2->next!=NULL&&pHead2->next->val<pHead1->val) pHead2=pHead2->next;
                if(pHead2->next==NULL){
                    pHead2->next=pHead1;
                    break;
                }else{
                    tmpNode=pHead2->next;
                    pHead2->next=pHead1;
                    pHead2=tmpNode;
                }
            }
        }
        return newHead;
    }
};

  

posted @ 2017-09-14 12:47  llauser  阅读(126)  评论(0编辑  收藏  举报