合并两个排序的链表

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

 首先考虑将两个链表的第一个元素比较拿到新链表的头结点,作为新链表的头,然后将两个链表逐个比较取较小结点放在新链表的后面,直至有链表出现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;
}

 后来看到别人另外一种思路,所谓哨兵结点,自己建立一个伪头,这样就不用纠结头结点的处理了。

另外还有一种方法,将所有结点的val比较后保存在新建的数组里,然后将val push到各个结点上,不过感觉有点麻烦。

posted @ 2021-05-20 20:51  偶遇的  阅读(113)  评论(0)    收藏  举报