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

劍指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;
    }
};