leetcode-JZ25

题面

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

示例1:

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

限制:

0 <= 链表长度 <= 1000

原题链接

分析

设置两个节点big和small,big节点的值永远大于等于small节点的值

源代码(注释部分即为思路)

/**
 * 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==NULL){
            return l2;
        }
        if(l2==NULL){
            return l1;
        }

        ListNode* big = l2;
        ListNode* small = l1;
        ListNode* ret = l1;
        
        //big节点的值永远大于等于small节点的值
        if(l1->val <= l2->val){
            big = l2;
            small = l1;
            ret = l1;
        }
        else{
            big = l1;
            small = l2;
            ret = l2;
        }
        
        //让small遍历结束即可
        while(small!=NULL){
            ListNode* pre;
            //while循环里有2个条件,2个条件的先后顺序很重要,需要把small!=NULL放在前面
            while(small!=NULL && (small -> val) <= (big -> val)){
                //pre是small的前序节点
                pre = small;
                small = small->next;
            }
            
            pre->next = big;
            
            //维护small和big节点
            if(small!=NULL){
                if(small->val > big->val){
                    ListNode* tmp = small;
                    small = big;
                    big = tmp;
                }
            }
        }
        return ret;

    }
};

你可能感兴趣的:(c++)