-
题目描述:
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
-
分析:
因为要合并的两个序列是递增有序的,而合并后的序列也要求是单调不减的,所以两个链表的头结点中比较小的那一个就是新的链表的头。这样就确定了新链表的第一个结点,拿出这个结点作为合并链表的头结点后,剩下的问题还是要合并两个有序链表,只不过其中一个链表的大小比原来小1。这就达到了递归的条件:可以将原问题分解成规模较小的与原问题相同的问题。所以,这道题可以用递归解决。
需要注意的是鲁棒性,以及如果使用递归需要有结束递归的条件。那么每次缩小问题的规模,即选择两个链表较小的一个头结点作为新序列的结点,然后转为求剩下两个较小链表的合并,极限情况就是有一个链表为空。所以,要考虑输入为空指针的情况:若list1为空则返回list2,list2为空返回list1。递归:
class Solution { public: ListNode* Merge(ListNode* pHead1, ListNode* pHead2) { if(pHead1 == NULL) return pHead2; else if(pHead2 == NULL) return pHead1; ListNode *pHead3 = NULL; if(pHead1->val < pHead2->val){ pHead3 = pHead1; pHead3->next = Merge(pHead1->next,pHead2); } else{ pHead3 = pHead2; pHead3->next = Merge(pHead1,pHead2->next); } return pHead3; } };
非递归:
ListNode* Merge(ListNode *pHead1, ListNode *pHead2) { if (pHead1 == NULL) return pHead2; else if (pHead2 == NULL) return pHead1; ListNode *pHead3 = NULL; if (pHead1->m_nValue < pHead2->m_nValue) { pHead3 = pHead1; pHead1 = pHead1->m_pNext; } else { pHead3 = pHead2; pHead2 = pHead2->m_pNext; } ListNode *p3 = pHead3; while (pHead1 != NULL && pHead2 != NULL) { if (pHead1->m_nValue < pHead2->m_nValue) { p3->m_pNext = pHead1; pHead1 = pHead1->m_pNext; p3 = p3->m_pNext; } else { p3->m_pNext = pHead2; pHead2 = pHead2->m_pNext; p3 = p3->m_pNext; } } if (pHead1 != NULL) p3->m_pNext = pHead1; else if (pHead2 != NULL) p3->m_pNext = pHead2; return pHead3; }
晚来天欲雪,能饮一杯无?