题目: 输入两个递增排序的链表,要求把两个链表和并成一个链表并且使得新链表也是递增排序的。
分析:
1. 假设两个链表如下所示
2. 要合并两个链表,可以利用归并排序的合并思想,从头枚举两个链表,判断两个指针指向的两个结点的值关系。
(1)初始化两个指针p1,p2分别指向两个链表的头结点,合并之后新的链表头结点肯定是两个链表中值较小的那个
(2)每一次比较两个指针指向的结点值的大小,如果p1较小则把p1指向结点加入新链表,否则加入p2指向的结点。直到有一个链表为空,然后把剩下的所有结点全部加入新链表即可
3. 代码(归并排序思想)
- //链表结点
- struct ListNode{
- int value;
- ListNode *nextNode;
- };
- //合并两个链表
- ListNode* MergeList(ListNode *headOne, ListNode *headTwo){
- //如果第一个链表是空链表返回链表2头结点
- if(headOne == NULL){
- return headTwo;
- }
- //如果第二个链表是空链表返回链表1头结点
- if(headTwo == NULL){
- return headOne;
- }
- //设定两个指针分别指向两个链表头结点
- ListNode *p1 = headOne;
- ListNode *p2 = headTwo;
- ListNode *newHeadNode = NULL;
- //判断哪一个是新的头结点
- if((p1->value) <= (p2->value)){
- newHeadNode = p1;
- p1 = p1->nextNode;
- }
- else{
- newHeadNode = p2;
- p2 = p2->nextNode;
- }
- //设置一个指向新链表的指针
- ListNode *curNode = newHeadNode;
- //合并两个链表
- while((p1 != NULL) && (p2 != NULL)){
- if((p1->value) <= (p2->value)){
- curNode->nextNode = p1;
- curNode = curNode->nextNode;
- p1 = p1->nextNode;
- }
- else{
- curNode->nextNode = p2;
- curNode = curNode->nextNode;
- p2 = p2->nextNode;
- }
- }
- //把剩下没有加入的全部加入新链表
- //最多只会有一个链表不为空
- while((p1 != NULL)){
- curNode->nextNode = p1;
- curNode = curNode->nextNode;
- p1 = p1->nextNode;
- }
- while(p2 != NULL){
- curNode->nextNode = p2;
- curNode = curNode->nextNode;
- p2 = p2->nextNode;
- }
- //返回新的链表结点
- return newHeadNode;
- }
递归代码,更加简洁
- struct ListNode{
- int value;
- ListNode *nextNode;
- };
- //合并两个链表
- ListNode* MergeList(ListNode *headOne, ListNode *headTwo){
- //链表1为空
- if(headOne == NULL){
- return headTwo;
- }
- //链表2为空
- if(headTwo == NULL){
- return headOne;
- }
- //新建一个结点
- ListNode *newNode = NULL;
- if((headOne->value) <= (headTwo->value)){
- newNode = headOne;
- newNode->nextNode = MergeList(headOne->nextNode, headTwo);
- }
- else{
- newNode = headTwo;
- newNode->nextNode = MergeList(headOne, headTwo->nextNode);
- }
- return newNode;
- }