/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 * };
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */

/**
 * 
 * @param pHead1 ListNode类 
 * @param pHead2 ListNode类 
 * @return ListNode类
 */
// struct ListNode* Merge(struct ListNode* pHead1, struct ListNode* pHead2 ) {
//     // write code here
//     struct ListNode* p = pHead1;
//     struct ListNode* t = pHead2;
//     struct ListNode* save;
    
//     if(pHead1 == NULL)
//         return pHead2;
    
//     if(pHead2 == NULL)
//         return pHead1;
//     if(pHead1 == NULL && pHead2 == NULL)
//         return NULL;
//     /*第一种情况
//       p: 1,3,5
//       t: 2,4,6
//     */
    
//     /*如果t的第后一个元素,小于p的第一个元素*/
//     while(t->next != NULL){
//         t = t->next;
//     }
    
//     if(t->val < p->val){
//        t->next = p;
//         return pHead2;
//     }
//      t = pHead2;
   
//     /*如果p的最后一个元素,小于t的第一个元素*/
//     while(p->next != NULL){
//         p = p->next;
//     }
    
//     if(p->val < t->val){
//         save = t;
//         p->next = t;
//         return pHead1;
//     }
    
    
//     for(p = pHead1; p->next != NULL, t != NULL; p = p->next){
//     if((p->val < t->val && p->next->val > t->val) || (p->val == t->val)){
//         /*将当前t节点插入p链表中*/
//         save = t;
//         t = t->next;
//         save->next = p->next;
//         p->next = save;
//         //p = p->next;
//     }
//    }
//     if(t != NULL){
//         save = t;
//         p->next = save;
//         return pHead1;
//     }
        
//      /*第二种情况
//       p: 2,4,6
//       t: 1,3,5
//     */
// //      p: 123
// //      t:456
// //      p: 456
// //      t: 123
    
//     return pHead1;
// }

/* 第二种方法·穿针引线法,将两个链表中的元素,按照从小到大的顺序链接好*/
struct ListNode* Merge(struct ListNode* pHead1, struct ListNode* pHead2 ) {
    struct ListNode* p = pHead1;
    struct ListNode* t = pHead2;
    struct ListNode* save;
    struct ListNode* NewNode = (struct ListNode*)malloc(sizeof(struct ListNode));
    struct ListNode* NewNodePointer = NewNode;
    
    if(pHead1 == NULL)
        return pHead2;
    
    if(pHead2 == NULL)
        return pHead1;
    
    while(p&&t){
        if(p->val <= t->val){
            NewNodePointer->next = p;
            NewNodePointer = NewNodePointer->next;
            p = p->next;
        }
        else{
            NewNodePointer->next = t;
            NewNodePointer = NewNodePointer->next;
            t = t->next;
        }
    }
    
    /*如果有一方已经是NULL*/
    if(p == NULL){
        NewNodePointer->next = t;
    }
    
    if(t == NULL){
        NewNodePointer->next = p;
    }

    //释放已经申请的头结点
    save = NewNode;
    NewNode = NewNode->next;
    free(save);
    
    return NewNode;
}