题目17 合并两个排序链表
/////////////////////////////////////////////////////////////////////////////////////
// 7. 题目17 合并两个排序链表
//时间复杂度:O(n), 空间复杂度:O(1)
ListNode<int>* MergeSortedLists(ListNode<int>* plhsHead, ListNode<int>* prhsHead) { if (NULL == plhsHead) { return prhsHead; } if (NULL == prhsHead) { return plhsHead; } ListNode<int>* pMergeHead = NULL; if (plhsHead->m_stData < prhsHead->m_stData) { pMergeHead = plhsHead; pMergeHead->m_pNextNode = MergeSortedLists(plhsHead->m_pNextNode, prhsHead); } else { pMergeHead = prhsHead; pMergeHead->m_pNextNode = MergeSortedLists(plhsHead, prhsHead->m_pNextNode); } return pMergeHead; } // 非递归方法:合并两个有序链表 //时间复杂度:O(n), 时间复杂度(1) ListNode<int>* MergeSortedLists_1(ListNode<int>* pHead1, ListNode<int>* pHead2) { if (NULL == pHead1) { return pHead2; } if (NULL == pHead2) { return pHead1; } // 1.新链表头结点 ListNode<int>* pMergeHead = NULL; if (pHead1->m_stData <= pHead2->m_stData) { pMergeHead = pHead1; pHead1 = pHead1->m_pNextNode; } else { pMergeHead = pHead2; pHead2 = pHead2->m_pNextNode; } ListNode<int>* pTmpNode = pMergeHead; // 2.比较两个链表,较小的节点加入新链表后面 while (pHead1 && pHead2) { if (pHead1->m_stData <= pHead2->m_stData) { pTmpNode = pHead1; pHead1 = pHead1->m_pNextNode; } else { pTmpNode = pHead2; pHead2 = pHead2->m_pNextNode; } // 不能让新链表中断!!!! if (NULL != pTmpNode->m_pNextNode) { pTmpNode = pTmpNode->m_pNextNode; } } // 3.链接剩余的元素 if (pHead1 && pTmpNode) { pTmpNode->m_pNextNode = pHead1; } if (pHead2 && pTmpNode) { pTmpNode->m_pNextNode = pHead2; } return pMergeHead; } void MergeSortedListsTestFunc() { cout << "\n\n --------------- MergeSortedListsTestFunc Start -------------->" << endl; // 初始化链表1 int aiArray[] = {1, 2, 3, 4, 5, 6, 7, 8}; int iLen = sizeof(aiArray) / sizeof(int); TRAVERSAL_ARRAY(aiArray, iLen); CSingleList<int>* pList = new CSingleList<int>(); if (!pList) { return; } for (int i = 0; i < iLen; i++) { pList->Insert(aiArray[i]); } pList->Traversal(); // 初始化链表2 int aiArray2[] = {9, 10, 11, 12, 13, 14, 15}; int iLen2 = sizeof(aiArray2) / sizeof(int); TRAVERSAL_ARRAY(aiArray2, iLen2); CSingleList<int>* pList2 = new CSingleList<int>(); if (!pList2) { SAVE_DELETE(pList); return; } for (int i = 0; i < iLen2; i++) { pList2->Insert(aiArray2[i]); } pList2->Traversal(); ListNode<int>* pHead1 = pList->GetHeadNode(); ListNode<int>* pHead2 = pList2->GetHeadNode(); // 合并链表 //ListNode<int>* pMergeNode = MergeSortedLists(pHead1, pHead2); //if (pMergeNode) //{ // cout << "两个有序链表合并后: " << endl; // TraversalList(pMergeNode); //} //cout << "合并后原来链表值: " << endl; //pList->Traversal(); //pList2->Traversal(); ListNode<int>* pMergeNode = MergeSortedLists_1(pHead1, pHead2); if (pMergeNode) { cout << "两个有序链表合并后: " << endl; TraversalList(pMergeNode); } // 释放内存 SAVE_DELETE(pList); // list 与 pList2 已经合并在一起,不用重复释放pLIst2!!!! //SAVE_DELETE(pList2); cout << "\n\n --------------- MergeSortedListsTestFunc End -------------->" << endl; }