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