合并有序链表

时间:2022-01-02 14:37:04
  • using namespace std;  
  •   
  •   
  • struct ListNode  
  • {  
  •     int         m_Data;  
  •     ListNode*   m_pNext;  
  •     ListNode(int value,ListNode* next = NULL):m_Data(value),m_pNext(next){}  
  • };  
  •   
  • /* 
  • 两个链表  比如链表1: 1->3->5->7->9 
  •             链表2:  2->4->6->8->10 
  •  
  •             跟我们合并两个数组一样,链表1的头结点  和链表2的头节点比较,如果链表1头节点的值大于链表2头接点的值, 
  •             那么链表2的头结点为合并链表的头结点,那么链表1的头节点继续和链表2的第二个节点(剩余链表2的头结点) 
  •             作比较,但一个链表遍历完之后,如果另外一个链表还没有遍历完,因为链表本来就是排序的,所以让合并链表的 
  •             尾巴节点指向未遍历完链表的头结点就可以 
  •  
  •             举个例子: 
  •  
  •             链表1: 1,3,5,23,34; 
  •             链表2: 2,4,6,8,10; 
  •             当遍历之后 链表3:1,2,3,4,8,10  此时链表2已经遍历完,while循环退出,但是剩余链表1还有 23,34 
  •             此时 让链表3的尾巴节点10 链接 剩余链表的头节点 23  就可以了 
  • */  
  •   
  • ListNode* MergeList2(ListNode* head1,ListNode* head2)  
  • {  
  •     if (head1 == NULL)  
  •     {  
  •         return head2;  
  •     }  
  •     else if(head2 == NULL)  
  •     {  
  •         return head1;  
  •     }  
  •   
  •     ListNode* MergeHead = NULL;  
  •     if (head1->m_Data < head2->m_Data)  
  •     {  
  •         MergeHead = head1;  
  •         head1 = head1->m_pNext;  
  •     }  
  •     else  
  •     {  
  •         MergeHead = head2;  
  •         head2 = head2->m_pNext;  
  •     }  
  •     ListNode* tmpNode = MergeHead;  
  •     while (head1&&head2)  
  •     {  
  •         if (head1->m_Data < head2->m_Data)  
  •         {  
  •             MergeHead->m_pNext = head1;  
  •             head1 = head1->m_pNext;  
  •         }  
  •         else  
  •         {  
  •             MergeHead->m_pNext = head2;  
  •             head2 = head2->m_pNext;  
  •         }  
  •         MergeHead = MergeHead->m_pNext;  
  •     }  
  •     if (head1)  
  •     {  
  •         MergeHead->m_pNext = head1;  
  •     }  
  •     if (head2)  
  •     {  
  •         MergeHead->m_pNext = head2;  
  •     }  
  •   
  •     return tmpNode;  
  •   
  • }  
  • int _tmain(int argc, _TCHAR* argv[])  
  • {  
  •     ListNode* pHead1 = new ListNode(1);  
  •     ListNode* pCur = pHead1;  
  •     for (int i = 3; i < 10; i+=2)  
  •     {  
  •         ListNode* tmpNode = new ListNode(i);  
  •         pCur->m_pNext = tmpNode;  
  •         pCur = tmpNode;  
  •     }  
  •   
  •     ListNode* pHead2 = new ListNode(2);  
  •     pCur = pHead2;  
  •     for (int j = 4; j < 10; j+=2)  
  •     {  
  •         ListNode* tmpNode = new ListNode(j);  
  •         pCur->m_pNext = tmpNode;  
  •         pCur = tmpNode;  
  •     }  
  •   
  •     ListNode* head = MergeList2(pHead1,pHead2);  
  •     while (head)  
  •     {  
  •         cout<<head->m_Data<<" ";  
  •         head=head->m_pNext;  
  •     }  
  •   
  •   
  •     getchar();  
  •     return 0;  
  • }</span>