【39】链表合并


题目: 输入两个递增排序的链表,要求把两个链表和并成一个链表并且使得新链表也是递增排序的。


分析:

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;
} 



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值