LeetCode21. 合并两个有序链表

题目描述:

将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 

示例:

输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

这道题目有两种解决方法,第一种是暴力解决,利用两个循环将其中一个链表中的节点一个一个地插入到另一个链表中,代码如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
         if(NULL == l1 && NULL != l2)
		    return l2;
         if(NULL != l1 && NULL == l2)
            return l1;
         if(NULL == l1 && NULL == l2)
            return NULL;
         ListNode* l1_head = NULL;
         ListNode* l2_head = NULL; 
         ListNode* temp1 = NULL;
         ListNode* temp2 = NULL;
         ListNode* prev = NULL;
         ListNode* helper = NULL;
         temp1 = l1;
         temp2 = l2;
         l1_head = l1;
         l2_head = l2;
         while (temp2)
         {
             temp1 = l1_head;
             while (temp1)
             {
                 if (temp2->val < temp1->val && temp1 == l1_head)//插入到开头
                 {
                     helper = temp2->next;
                     temp2->next = temp1;
                     l1_head = temp2;
                     temp2 = helper;
                     break;
                 }
                 if (temp1->next && temp2->val >= temp1->val && temp2->val <= temp1->next->val){
                     helper = temp2->next;
                     temp2->next = temp1->next;
                     temp1->next = temp2;
                     temp2 = helper;
                     break;
                 }else if(!temp1->next){ //插入到最后
                    helper = temp2->next;
                    temp2->next = NULL;
                    temp1->next = temp2;
                    temp2 = helper;
                    break;
                 }
                 temp1 = temp1->next;
             }
         }
         return l1_head;
    }
};

运行结果如下:

第二种方法是每次将l1和l2的头结点作比较,较小的拿出来用尾插法放到结果链表中,当其中一个比较完为空的时候结束循环,最后将没有比较完的那个剩余链表放到结果链表的后面。代码如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        if(!l1 && !l2)
		    return NULL;
        if(l1 && !l2)
            return l1;
        if(!l1 && l2)
            return l2;

        ListNode tmpHead(INT_MIN);//建立一个临时的头结点
        ListNode* ptr = &tmpHead;//ptr指向当前的节点,初始时指向头节点
        while (l1 && l2)
        {
            if (l1->val <= l2->val)
            {
                ptr->next = l1;
                l1 = l1->next;
            }else if(l1->val > l2->val){
                ptr->next = l2;
                l2 = l2->next;
            }
            ptr = ptr->next;
        }
        if(l1)
            ptr->next = l1;
        else
            ptr->next = l2;
        return tmpHead.next;
    }
};

运行结果如下:

第二种方法比较快!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值