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

合并两个排序的链表

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

题目难度:简单
考察内容:链表
题目简介:给两个非递减单链表l1, l2,合并为一个非递减的单链表。

1.问题分析
给了两个非递减的单链表,合并成一个非递减的单链表,这个问题和归并排序的思想很像
回忆下归并排序,(l,mid)和(mid+1,r)排好序后合并,下面给出代码

void m_sort(int q[],int l,int r)
{
    if(l>=r)return ;
    int mid=l+r>>1;
    m_sort(q,l,mid),m_sort(q,mid+1,r);
    int i=l,j=mid+1,k=0;
    while(i<=mid&&j<=r)
    {
        if(q[i]<=q[j])tem[k++]=q[i++];
        else tem[k++]=q[j++];
    }
    while(i<=mid)tem[k++]=q[i++];
    while(j<=r)tem[k++]=q[j++];
    for(int i=l,j=0;i<=r;i++,j++)q[i]=tem[j];
}

具体方法为利用单调性每次加入一个元素,最后剩下的全部加入,所以复杂度是O(n+m)的
这题是将链表合并,思想还是一样的,每次连接较小的一个数,最后剩下的全部连接
具体过程如下图
图片说明
这里设置了一个虚拟头节点,也叫哨兵节点,避免空指针异常

 ListNode *vhead = new ListNode(-1);
        ListNode *cur = vhead;

下面就很好实现代码了

class Solution {
public:
    ListNode* Merge(ListNode* pHead1, ListNode* pHead2) {
        ListNode *vhead = new ListNode(-1);
        //设置虚拟头节点
        ListNode *cur = vhead;
        while (pHead1 && pHead2) {//两个链表任意一个为空都会跳出循环,因为此时只需将剩下的全部链接即可
            if (pHead1->val <= pHead2->val) {
                cur->next = pHead1;
                pHead1 = pHead1->next;
            }
            //指向较小的一个数
            else {
                cur->next = pHead2;
                pHead2 = pHead2->next;
            }
            cur = cur->next;
        }
        cur->next = pHead1 ? pHead1 : pHead2;
        return vhead->next;
    }
};
全部评论

相关推荐

不愿透露姓名的神秘牛友
2025-12-19 00:26
点赞 评论 收藏
分享
白火同学:1、简历可以浓缩成一页,简历简历先要“简”方便HR快速过滤出有效信息,再要“历”用有效信息突出个人的含金量。 2、教育背景少了入学时间~毕业时间,HR判断不出你是否为应届生。 3、如果你的平台账号效果还不错,可以把账号超链接或者用户名贴到对应位置,一是方便HR知道你是具体做了什么内容的运营,看到账号一目了然,二是口说无凭,账号为证,这更有说服力。
面试被问期望薪资时该如何...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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