LeetCode:21.合并两个有序链表之第一次的特殊情况

21. 合并两个有序链表 - 力扣(LeetCode)

除了平平无奇外,就是关于对第一次(无头)特殊情况的处理,理解有无头的方便与否

LeetCode:21.合并两个有序链表之第一次的特殊情况_第1张图片

 以下是代码+注释

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
    if(list1 == NULL){
        return list2;
    }
    if(list2 == NULL){
        return list1;
    }
    //特殊情况处理完了,现在是一般的对链表的操作
    struct ListNode* pNew = NULL;
    //本代码使用重新创建一个链表法(迭代法),建议造一个头结点或者把一般情况的第一次赋值搞出来
    //(主要是为了,把这第一次的特殊情况扔进循环里)
    if(list1->val < list2->val){
        pNew = list1;
        list1 = list1->next;
        //pNew->next =NULL;
        //理应写的
    }
    else{
        pNew = list2;
        list2 = list2->next;
        //pNew->next =NULL;
    }
    struct ListNode* pReturn = pNew;//记录返回的指针
    while(list1 && list2){//谁先排完谁出去(很容易想到,类似于两个人玩斗地主,总有一个人先出完牌)
        if(list1->val < list2->val){
            pNew->next = list1;
            //这里也是就不添了置NULL操作
            list1 = list1->next;
            pNew = pNew->next; 
        }
        else{
            pNew->next = list2;
            list2 = list2->next;
            pNew = pNew->next;
        }
    }
    if(list1 == NULL){
        pNew->next = list2; 
    }
    if(list2 == NULL){
        pNew->next = list1;
    }
    return pReturn;
}

 

你可能感兴趣的:(leetcode,链表,算法,c语言,数据结构)