题解 | #合并两个排序的链表#

合并两个排序的链表

https://www.nowcoder.com/practice/d8b6b4358f774294a89de2a6ac4d9337

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 * };
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param pHead1 ListNode类 
 * @param pHead2 ListNode类 
 * @return ListNode类
 */
#include <stdlib.h>
struct ListNode* Merge(struct ListNode* pHead1, struct ListNode* pHead2 ) {
    // write code here
    struct ListNode* p1 = pHead1;   //p1用于遍历第一个单链表
    struct ListNode* p2 = pHead2;   //p2用于遍历第二个单链表
    struct ListNode* s1=NULL;       //s1用于记录p1目前遍历到的结点,s1记录后p1往后移动
    struct ListNode* s2=NULL;       //s2用于记录p2目前遍历到的结点,s2记录后p1往后移动

    struct ListNode* newnode = (struct ListNode*)malloc(sizeof(struct ListNode)); //新建立一个带头结点的单链表,方便操作
    newnode->next = NULL;
    struct ListNode* pnew = newnode;    //pnew辅助尾插,用于遍历记录新链表的最后一个几点,方便插入新结点

    while(p1&&p2){  //同时遍历两个单链表,只要有一个被遍历完就退出循环
        if(p1->val<=p2->val){   //如果此时p1的值小于p2的值,则将p1尾插到新链表尾部
            s1 = p1;    //s1记录此时p1遍历到的接地单
            p1 = p1->next;  //s1已经记录,p1向后走
            s1->next = NULL;    //尾插,所以s1->next =NULL
            pnew ->next = s1;   //将s1尾插进新链表 
            pnew = pnew->next;  //pnew向后遍历,记录此时新链表最后的一个结点
        }else{                  //如果此时p2的值小于p2的值,则将p2尾插到新链表尾部
            s2 = p2;
            p2 = p2->next;
            s2->next = NULL;
            pnew->next = s2;
            pnew = pnew->next;
        } 
    }

    if(p1==NULL){  //退出循环后,将没遍历完的那一个链表的剩余部分连接上新链表
        pnew->next = p2;
    }else{
        pnew->next = p1;
    }

    return newnode->next;   //返回一个不带头结点的单链表

}

全部评论

相关推荐

牛客51274894...:照片认真的吗,找个专门拍证件照的几十块钱整端正点吧,要不就别加照片
点赞 评论 收藏
分享
想踩缝纫机的小师弟练...:不理解你们这些人,要放记录就把对方公司名字放出来啊。不然怎么网暴他们
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务