劍指offer 25. 合併兩個排序的鏈表

1.問題描述

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

2.解決思路

1)非遞歸的方法

    如果可以改變鏈表,直接從頭結點開始依次移動比較兩個鏈表當前值的大小,把較小的值作爲當前結點的下一個結點。

   注意:剛剛開始的時候不知道頭結點到底是1的還是2的,所以新建一個額外的新節點作爲輔助:

   ListNode *first = new ListNode(-1);

   返回first->next即爲所求。

2)遞歸的方法

   每次比較頭結點node1和node2的值,如果把小的作爲當前的結點,然後遞歸地比較下一個結點。

3.代碼實現

1)非遞歸方法

/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
//非遞歸解決方法
class Solution {
public:
	ListNode* Merge(ListNode* node1, ListNode* node2)
	{
		if (node1 == NULL) return node2;
		if (node2 == NULL) return node1;
		ListNode* first = new ListNode(-1);
		ListNode* tmp = first;
		while (node1 != NULL && node2 != NULL){
			if (node1->val <= node2->val){
				tmp->next = node1;
				node1 = node1->next;
			}
			else{
				tmp->next = node2;
				node2 = node2->next;
			}
			tmp = tmp->next;
		}
		if (node1 == NULL) tmp->next = node2;
		if (node2 == NULL) tmp->next = node1;	
		return first->next;
	}
};

2)遞歸方法

class Solution {
public:
	ListNode* Merge(ListNode* node1, ListNode* node2)
    {
        if(node1 == NULL) return node2;
        if(node2 == NULL) return node1;
        ListNode *head;
        if(node1->val <= node2->val){
            head = node1;
            head->next = Merge(node1->next, node2);
        }
        else{
            head = node2;
            head->next = Merge(node1, node2->next);
        }
        return head;
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章