美文网首页lintcode程序员
165. 合并两个排序链表

165. 合并两个排序链表

作者: 和蔼的zhxing | 来源:发表于2018-01-19 21:08 被阅读29次

    将两个排序链表合并为一个新的排序链表.
    样例
    给出 1->3->8->11->15->null,2->null, 返回 1->2->3->8->11->15->null。

    双指针

    这个和合并两个排序数组是一样的,两个指针就行了,只是不像vector那样简单赋值就可以了,而是要通过变换指针来连接起来,思路就是新建一个链表,通过双指针每次分离出来一个节点,把这个节点链接到新链表的后面,当一个链表遍历完之后,只需把另外一个链表剩下的整个链接到新链表的后面就行了,写起来也是不难,像链表的这种遍历和拆解都应该形成自己的一套固定的写法,会简单许多。

    ListNode * mergeTwoLists(ListNode * l1, ListNode * l2) {
            if(!l1)
                return l2;
            if(!l2)
                return l1;
            
            
            ListNode *newhead=new ListNode(0);
            ListNode *newhead_back;
            ListNode *head1=l1;
            ListNode *head2=l2;
            ListNode *tmp1;
            ListNode *tmp2;
            
            while((head1!=NULL)&&(head2!=NULL))   //两个都不空,才进while循环
            {
                tmp1=head1;
                tmp2=head2;
                
                //tmp1->next=NULL;
                //tmp2->next=NULL;
                
                if(tmp1->val<tmp2->val)
                {
                    
                    head1=head1->next;
                    tmp1->next=NULL;
                    if(!newhead->next)
                    {
                        newhead->next=tmp1;
                        newhead_back=newhead->next;
                    }
                    else
                    {
                    newhead_back->next=tmp1;
                    newhead_back=newhead_back->next;
                    }
                    
                }
                else 
                {
                    
                    head2=head2->next;
                    tmp2->next=NULL;
                    if(!newhead->next)
                    {
                        newhead->next=tmp2;
                        newhead_back=newhead->next;
                    }
                    else
                    {
                    newhead_back->next=tmp2;
                    newhead_back=newhead_back->next;
                    }
                    
                }
            }
            
            if(head1)     //如果head1不空,把其连接到后面
            {
                newhead_back->next=head1;
                return newhead->next;
            }
            if(head2)     //如果head2不空,把其连接到后面
            {
                newhead_back->next=head2;
                return newhead->next;
            }
            
            return newhead->next;
            // write your code here
        }
    

    相关文章

      网友评论

        本文标题:165. 合并两个排序链表

        本文链接:https://www.haomeiwen.com/subject/oymaoxtx.html