首页 > 编程语言 > 详细

合并两个排序的链表

时间:2021-05-20 23:07:31      阅读:25      评论:0      收藏:0      [点我收藏+]

输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。

 首先考虑将两个链表的第一个元素比较拿到新链表的头结点,作为新链表的头,然后将两个链表逐个比较取较小结点放在新链表的后面,直至有链表出现NULL。

学习单链表的时候写头插尾插头删尾删都可以顺利写出,没想到单链表的题目比较刁钻,这里走了不少弯路,先是新链表的头结点怎么获取有点糊涂,如果放在循环内将导致丢失指针,放在循环外的话,循环内的控制又有点糊涂。

struct ListNode* MerNode(struct ListNode* l1,struct ListNode* l2)
{
    struct ListNode* n1=l1;
    struct ListNode* n2=l2;
    struct ListNode* head=NULL;
    if(n1==NULL)
        return n2;
     
    if(n2==NULL)
        return n1;
    
    if(n1->val<n2->val )
    {
        head=n1;
        n1=n1->next;}
    else
    {
        head=n2;
        n2=n2->next;}
    struct ListNode* newhead=head;//新结点
    while(n1 && n2)//采用&&是因为无论哪个结点出现NULL都要停止
    {
        if(n1->val<n2->val)
        {
            head->next=n1;
            n1=n1->next;
            head=head->next;
        }
        else
        {
            head->next=n2;
            head=head->next;
            n2=n2->next;
        }
    }
    if(n1)
    {
        head->next=n1;//这里只需要一次,因为没有NULL的链表后面结点仍然是有效链接的,不然就需要while并控制循环继续插入        
    }
    if(n2)
    {
        head->next=n2;
    }
    return newhead;
}

 

合并两个排序的链表

原文:https://www.cnblogs.com/shine365/p/14791502.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!