1. 程式人生 > >劍指offer25--合併兩個排序的連結串列

劍指offer25--合併兩個排序的連結串列

題目描述

輸入兩個單調遞增的連結串列,輸出兩個連結串列合成後的連結串列,當然我們需要合成後的連結串列滿足單調不減規則。

 

思路:

  • 判斷空
  • 頭節點需要判斷,
  • 然後讓頭節點一個一個吞噬連結串列。

比較麻煩

/*
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||pHead2==NULL)
            return pHead1==NULL?pHead2:pHead1;
        ListNode* tmp1=pHead1;
        ListNode* tmp2=pHead2;
        ListNode* front(0);
        ListNode* refront(0);
        if(tmp1->val>tmp2->val){
                front=tmp2;
                refront=front;
                tmp2=tmp2->next;
        }else{
                front=tmp1;
                refront=front;
                tmp1=tmp1->next;
        }
        while(tmp1!=NULL&&tmp2!=NULL)
        {
            if(tmp1->val>tmp2->val){
                ListNode* tmp=tmp2;
                tmp2=tmp2->next;
                front->next=tmp;
                front=front->next;
            }else{
                ListNode* tmp=tmp1;
                tmp1=tmp1->next;
                front->next=tmp;
                front=front->next;
            }
        }
        while(tmp1!=NULL){
            front->next=tmp1;
            tmp1=tmp1->next;
        }
        while(tmp2!=NULL){
            front->next=tmp2;
            tmp2=tmp2->next;
        }

        return refront;
    }
};

劍指offer解法:

遞迴的解法比較好用

/*
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;
        else if(pHead2==NULL)
            return pHead1;
        ListNode* tmp(0);
        if(pHead1->val>pHead2->val)
        {
            tmp=pHead2;
            tmp->next=Merge(pHead1,pHead2->next);
        }else{
            tmp=pHead1;
            tmp->next=Merge(pHead1->next,pHead2);
        }
        return tmp;
    }
};