【面试题017】合并两个排序的链表
两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。
MergeList.cpp:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
#include <iostream>
#include <cstdio> #include "List.h" using namespace std; ListNode *Merge(ListNode *pHead1, ListNode *pHead2) { if(pHead1 == NULL) { return pHead2; } else if(pHead2 == NULL) { return pHead1; } ListNode *pMergeHead = NULL; if(pHead1->m_nValue < pHead2->m_nValue) { pMergeHead = pHead1; pMergeHead->m_pNext = Merge(pHead1->m_pNext, pHead2); } else { pMergeHead = pHead2; pMergeHead->m_pNext = Merge(pHead1, pHead2->m_pNext); } return pMergeHead; } // ====================测试代码==================== ListNode *Test(char *testName, ListNode *pHead1, ListNode *pHead2) { if(testName != NULL) printf("%s begins: ", testName); printf("The first list is: "); PrintList(pHead1); printf("The second list is: "); PrintList(pHead2); printf("The merged list is: "); ListNode *pMergedHead = Merge(pHead1, pHead2); PrintList(pMergedHead); return pMergedHead; } // list1: 1->3->5 // list2: 2->4->6 int main() { ListNode *pNode1 = CreateListNode(1); ListNode *pNode3 = CreateListNode(3); ListNode *pNode5 = CreateListNode(5); ConnectListNodes(pNode1, pNode3); ConnectListNodes(pNode3, pNode5); ListNode *pNode2 = CreateListNode(2); ListNode *pNode4 = CreateListNode(4); ListNode *pNode6 = CreateListNode(6); ConnectListNodes(pNode2, pNode4); ConnectListNodes(pNode4, pNode6); ListNode *pMergedHead = Test("Test1", pNode1, pNode2); DestroyList(pMergedHead); return 0; } |
运行结果:
Test1 begins:
The first list is:
PrintList starts.
1 3 5
PrintList ends.
The second list is:
PrintList starts.
2 4 6
PrintList ends.
The merged list is:
PrintList starts.
1 2 3 4 5 6
PrintList ends.
List.h:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#ifndef _LIST_H_
#define _LIST_H_ struct ListNode { int m_nValue; ListNode* m_pNext; }; ListNode* CreateListNode(int value); void ConnectListNodes(ListNode* pCurrent, ListNode* pNext); void PrintListNode(ListNode* pNode); void PrintList(ListNode* pHead); void DestroyList(ListNode* pHead); void AddToTail(ListNode** pHead, int value); void RemoveNode(ListNode** pHead, int value); #endif //_LIST_H_ |
List.cpp:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
#include "list.h"
#include <stdio.h> #include <stdlib.h> ListNode *CreateListNode(int value) { ListNode *pNode = new ListNode(); pNode->m_nValue = value; pNode->m_pNext = NULL; return pNode; } void ConnectListNodes(ListNode *pCurrent, ListNode *pNext) { if(pCurrent == NULL) { printf("Error to connect two nodes. "); exit(1); } pCurrent->m_pNext = pNext; } void PrintListNode(ListNode *pNode) { if(pNode == NULL) { printf("The node is NULL "); } else { printf("The key in node is %d. ", pNode->m_nValue); } } void PrintList(ListNode *pHead) { printf("PrintList starts. "); ListNode *pNode = pHead; while(pNode != NULL) { printf("%d ", pNode->m_nValue); pNode = pNode->m_pNext; } printf(" PrintList ends. "); } void DestroyList(ListNode *pHead) { ListNode *pNode = pHead; while(pNode != NULL) { pHead = pHead->m_pNext; delete pNode; pNode = pHead; } } void AddToTail(ListNode **pHead, int value) { ListNode *pNew = new ListNode(); pNew->m_nValue = value; pNew->m_pNext = NULL; if(*pHead == NULL) { *pHead = pNew; } else { ListNode *pNode = *pHead; while(pNode->m_pNext != NULL) pNode = pNode->m_pNext; pNode->m_pNext = pNew; } } void RemoveNode(ListNode **pHead, int value) { if(pHead == NULL || *pHead == NULL) return; ListNode *pToBeDeleted = NULL; if((*pHead)->m_nValue == value) { pToBeDeleted = *pHead; *pHead = (*pHead)->m_pNext; } else { ListNode *pNode = *pHead; while(pNode->m_pNext != NULL && pNode->m_pNext->m_nValue != value) pNode = pNode->m_pNext; if(pNode->m_pNext != NULL && pNode->m_pNext->m_nValue == value) { pToBeDeleted = pNode->m_pNext; pNode->m_pNext = pNode->m_pNext->m_pNext; } } if(pToBeDeleted != NULL) { delete pToBeDeleted; pToBeDeleted = NULL; } } |
Makefile:
1
2 3 4 5 6 7 8 9 10 11 12 |
.PHONY:clean
CPP=g++ CFLAGS=-Wall -g BIN=test OBJS=MergeList.o List.o LIBS= $(BIN):$(OBJS) $(CPP) $(CFLAGS) $^ -o $@ $(LIBS) %.o:%.cpp $(CPP) $(CFLAGS) -c $< -o $@ clean: rm -f *.o $(BIN) |