Leetcode c语言- Merge Two Sorted Lists

Title:

Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists.


这道题给定两个从小到大排列好的链表,然后合并为一个,要求新链表也是从小到大排列。


第一种思路是先选定一个链表l1,然后遍历链表l2,看l2的每一个节点与l1中节点的关系,然后插入该节点即可。解法如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) {
    struct ListNode* p=l1;
    struct ListNode* q=l2;
    struct ListNode* temp;
    struct ListNode* result;
    
    if(l1==NULL)
        return l2;
    if (l2==NULL)
        return l1;

    if (l1->val<=l2->val) {
        
        while (l2) {
            printf("%d\n",l2->val);
            if (p->next==NULL) {
                p->next=q;
                return l1;
            }
                
            else if (q->val<= p->next->val) {
                
                l2->next=p->next;
                p->next=l2;
                p=p->next;
                l2=l2->next;
                q=q->next;
            }
            else if (l2->val > p->next->val) {
                p=p->next;
            }
        }
        return l1;
    }   
    else {
        while (l1) {
            if (q->next==NULL) {
                q->next=p;
                return l2;
            }
                
            else if ( l1->val<= q->next->val) {
                temp=q->next;
                q->next=l1;
                q->next->next=temp;
                q=q->next;
                l1=l1->next;
            }
            else if (l1->val > q->next->val) {
                q=q->next;
            }
        }
        return l2;
    }
        
    
    
    
}


这种解法存在一个致命的缺陷,要从l2中把一个节点插入l1中,无法做到:

                l2->next=p->next;
                p->next=l2;

一般将一个单独的节点插入一个链表的做法就是如上两行代码。但是对于一个链表中的一个节点插入到另一个链表中,方法失效。因为后续操作中,要遍历l2,就要将l2=l2->next,但这个时候l2->next=p->next,这个时候就会陷入一个死循环。



因此这道题的正确结题思路是新建一个新的链表,然后首先判断l1和l2的第一个节点大小,如果l1大,将新建的链表temp指向l1的第一个节点:

temp=l1;


然后判断l1和l2的节点大小,小的那方将节点插入temp,然后+1前进一个节点,直到两个链表中有一个率先到达最后,这个时候再将链表temp指向另一个链表的剩余部分,完成合并。



solution:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) {

    struct ListNode* temp;
    struct ListNode* result;
    
    if(l1==NULL)
        return l2;
    if (l2==NULL)
        return l1;

    if (l1->val<=l2->val) {
        temp=l1;
        l1=l1->next;
    }   
    else {
        temp=l2;
        l2=l2->next;
    }
        
    result=temp;
    
    while(l1 && l2) {
        if (l1->val<=l2->val) {
            temp->next=l1;
            l1=l1->next;
        }
        else {
            temp->next=l2;
            l2=l2->next;
        }  
        temp=temp->next;
    }
    
    if(l1) {
        temp->next=l1;
    }
    else if(l2){
        temp->next=l2;
    }
    
    return result;
    
}



转载于:https://www.cnblogs.com/sichenzhao/p/9320228.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值