合并两个有序链表
1.非递归方式
1 #include "stdafx.h" 2 #include <iostream> 3 using namespace std; 4 5 struct ListNode 6 { 7 int m_nValue; 8 ListNode *m_pNext; 9 }; 10 11 //合并两个有序链表,非递归方法 12 ListNode *MergeTwoList(ListNode *pListOneHead, ListNode *pListTwoHead) 13 { 14 if (pListOneHead == NULL) 15 { 16 return pListTwoHead; 17 } 18 19 if (pListTwoHead == NULL) 20 { 21 return pListOneHead; 22 } 23 24 ListNode *pNode1 = pListOneHead; 25 ListNode *pNode2 = pListTwoHead; 26 ListNode *pMergeListHead = NULL; 27 ListNode *pCurLastNode = NULL; 28 29 if (pNode1->m_nValue < pNode2->m_nValue) 30 { 31 pMergeListHead = pListOneHead; 32 pNode1 = pNode1->m_pNext; 33 pCurLastNode = pMergeListHead; 34 } 35 else 36 { 37 pMergeListHead = pListTwoHead; 38 pNode2 = pNode2->m_pNext; 39 pCurLastNode = pMergeListHead; 40 } 41 42 while (pNode1 != NULL && pNode2 != NULL) 43 { 44 if (pNode1->m_nValue < pNode2->m_nValue) 45 { 46 pCurLastNode->m_pNext = pNode1; 47 pCurLastNode = pNode1; 48 pNode1 = pNode1->m_pNext; 49 } 50 else 51 { 52 pCurLastNode->m_pNext = pNode2; 53 pCurLastNode = pNode2; 54 pNode2 = pNode2->m_pNext; 55 } 56 57 if (pNode1 == NULL) 58 { 59 pCurLastNode->m_pNext = pNode2; 60 } 61 62 if (pNode2 == NULL) 63 { 64 pCurLastNode->m_pNext = pNode1; 65 } 66 } 67 68 return pMergeListHead; 69 } 70 71 //创建一个链表,输入从头到尾结点的值,输入-1表示结束 72 void CreateList(ListNode *& pHead) 73 { 74 ListNode *pListNode = NULL; 75 ListNode *pCurLastNode = NULL; 76 bool isHead = true; 77 78 while (1) 79 { 80 if (isHead) 81 { 82 pHead = new ListNode(); 83 cin >> pHead->m_nValue; 84 if (pHead->m_nValue == -1) 85 { 86 pHead = NULL; 87 break; 88 } 89 pHead->m_pNext = NULL; 90 isHead = false; 91 pCurLastNode = pHead; 92 } 93 else 94 { 95 pListNode = new ListNode(); 96 cin >> pListNode->m_nValue; 97 if (pListNode->m_nValue == -1) 98 { 99 break; 100 } 101 pListNode->m_pNext = NULL; 102 pCurLastNode->m_pNext = pListNode; 103 pCurLastNode = pListNode; 104 } 105 } 106 } 107 108 //从头到尾打印链表 109 void PrintList(ListNode *&pHead) 110 { 111 if (pHead != NULL) 112 { 113 ListNode *pCur = pHead; 114 while (pCur != NULL) 115 { 116 cout << pCur->m_nValue << " "; 117 pCur = pCur->m_pNext; 118 } 119 cout << endl; 120 } 121 else 122 { 123 cout << "链表为空!" << endl; 124 } 125 } 126 127 int _tmain(int argc, _TCHAR* argv[]) 128 { 129 ListNode *pList1Head = NULL; 130 CreateList(pList1Head); 131 PrintList(pList1Head); 132 133 ListNode *pList2Head = NULL; 134 CreateList(pList2Head); 135 PrintList(pList2Head); 136 137 ListNode *pMergeListHead = MergeTwoList(pList1Head, pList2Head); 138 if (pMergeListHead != NULL) 139 { 140 cout << pMergeListHead->m_nValue << endl; 141 } 142 PrintList(pMergeListHead); 143 144 system("pause"); 145 return 0; 146 } 147 148
递归方式:
#include "stdafx.h" #include <iostream> using namespace std; struct ListNode { int m_nValue; ListNode *m_pNext; }; //合并两个有序链表,递归方法 ListNode *MergeTwoList(ListNode *pListOneHead, ListNode *pListTwoHead) { if (pListOneHead == NULL) { return pListTwoHead; } if (pListTwoHead == NULL) { return pListOneHead; } ListNode *pMergeListHead = NULL; if (pListOneHead->m_nValue < pListTwoHead->m_nValue) { pMergeListHead = pListOneHead; pMergeListHead->m_pNext = MergeTwoList(pMergeListHead->m_pNext, pListTwoHead); } else { pMergeListHead = pListTwoHead; pMergeListHead->m_pNext = MergeTwoList(pListOneHead, pMergeListHead->m_pNext); } return pMergeListHead; } //创建一个链表,输入从头到尾结点的值,输入-1表示结束 void CreateList(ListNode *& pHead) { ListNode *pListNode = NULL; ListNode *pCurLastNode = NULL; bool isHead = true; while (1) { if (isHead) { pHead = new ListNode(); cin >> pHead->m_nValue; if (pHead->m_nValue == -1) { pHead = NULL; break; } pHead->m_pNext = NULL; isHead = false; pCurLastNode = pHead; } else { pListNode = new ListNode(); cin >> pListNode->m_nValue; if (pListNode->m_nValue == -1) { break; } pListNode->m_pNext = NULL; pCurLastNode->m_pNext = pListNode; pCurLastNode = pListNode; } } } //从头到尾打印链表 void PrintList(ListNode *&pHead) { if (pHead != NULL) { ListNode *pCur = pHead; while (pCur != NULL) { cout << pCur->m_nValue << " "; pCur = pCur->m_pNext; } cout << endl; } else { cout << "链表为空!" << endl; } } int _tmain(int argc, _TCHAR* argv[]) { ListNode *pList1Head = NULL; CreateList(pList1Head); PrintList(pList1Head); ListNode *pList2Head = NULL; CreateList(pList2Head); PrintList(pList2Head); ListNode *pMergeListHead = MergeTwoList(pList1Head, pList2Head); if (pMergeListHead != NULL) { cout << pMergeListHead->m_nValue << endl; } PrintList(pMergeListHead); system("pause"); return 0; }
浙公网安备 33010602011771号