【剑指offer】面试题17、合并两个排序的链表
2015-06-20 14:08
731 查看
题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。例如输入图中的链表 1 和链表 2,则合并之后的升序链表如链表 3 所示。链表结点定义如下: typedef struct Node { int m_nValue; struct Node *m_pNext; }ListNode;
#include "stdio.h" #include "stdlib.h" #include "time.h" #define N 10 typedef struct Node { int m_nValue; struct Node *m_pNext; }ListNode, *pListNode; // 创建有序链表 void createOrderedList(ListNode **pHead, int len) { while(len--) { ListNode *pNew = (ListNode*)malloc(sizeof(ListNode)); pNew->m_nValue = rand()%100; pNew->m_pNext = NULL; if(*pHead == NULL) // 空 *pHead = pNew; else //非空 { ListNode *pNode = *pHead; ListNode *pPre = NULL; while(pNode != NULL) { if(pNode->m_nValue < pNew->m_nValue) { pPre = pNode; pNode = pNode->m_pNext; } else break; } // 插入的位置 if(pPre == NULL) // 头结点位置 { pNew->m_pNext = *pHead; *pHead = pNew; } else // 其他位置 { pNew->m_pNext = pNode; pPre->m_pNext = pNew; } } } } void printList(ListNode *pHead) { while(pHead != NULL) { printf("%3d ", pHead->m_nValue); pHead = pHead->m_pNext; } printf("\n"); } // 合并有序链表 ListNode *Merge(ListNode *leftHead, ListNode *rightHead) { if(!leftHead) return rightHead; else if(!rightHead) return leftHead; ListNode *mergeHead, *mergeTail; mergeHead = mergeTail = NULL; ListNode *pLeft = leftHead; ListNode *pRight = rightHead; while(pLeft != NULL && pRight != NULL) { if(pLeft->m_nValue < pRight->m_nValue) // 左链表结点值比右链表结点值大 { if(mergeHead == NULL) // 头结点 { mergeHead = mergeTail = pLeft; } else // 非头结点 { mergeTail->m_pNext = pLeft; mergeTail = pLeft; } pLeft = pLeft->m_pNext; } else// 右链表结点值比左链表结点值大 { if(mergeHead == NULL) // 头结点 { mergeHead = mergeTail = pRight; } else // 非头结点 { mergeTail->m_pNext = pRight; mergeTail = pRight; } pRight = pRight->m_pNext; } } if(pLeft != NULL) mergeTail->m_pNext = pLeft; if(pRight != NULL) mergeTail->m_pNext = pRight; return mergeHead; } int main(int argc, char const *argv[]) { srand(time(NULL)); ListNode *pHead1 = NULL; ListNode *pHead2 = NULL; createOrderedList(&pHead1, N); printf("List1: "); printList(pHead1); createOrderedList(&pHead2, N); printf("List2: "); printList(pHead2); ListNode *pMergeHead = Merge(pHead1, pHead2); if(pMergeHead != NULL) { printf("The Merge Node: %d\n", pMergeHead->m_nValue); } printf("MergedList: "); printList(pMergeHead); return 0; }
View Code
本文完。
相关文章推荐
- 【剑指offer】面试题16、反转链表
- 黑马程序员——Java基础——String类的学习
- 黑马程序员--java学习笔记第七天
- 程序员技术练级攻略(皓哥)
- vim的学习小小笔记
- 黑马程序员——IO流(一)
- 黑马程序员——Java基础---面向对象 (概述及封装等)
- 黑马程序员——JAVA笔记——单例设计模式
- 黑马程序员--JAVA学习笔记第六天
- 去哪儿科技实习生面试总结【通过面试】
- 黑马程序员——JAVA笔记——String类
- 《人,绩效和职业道德》读后感
- 黑马程序员——集合(二)
- 黑马程序员——集合(一)
- 黑马程序员--面向对象细节知识点--3rd day
- 黑马程序员---多态
- 黑马程序员_面向对象2
- 黑马程序员——基础知识总结_泛型
- 黑马程序员-C基础-C语言概述
- 读《人,绩效和职业道德》有感