面试题 17,合并两个排序的链表

思路:(1)询问是新建一个合并列表,还是利用原有链表结点创建新链表。(2)代码思路是每个链表一个指针,比较两个指针的结点值,较小结点的指针后移一个结点,指针原来所在的结点被放入新链表,或者值被拷入新链表。

边界:两个空链表的输入和单个空链表的输入。

代码:

#include <stdio.h>

int mergeList(ListNode *head1, ListNode *head2){
    if(NULL == head1)
        return head2;
    if(NULL == head2)
        return head1;
    
    ListNode *p1 = head1;
    ListNode *p2 = head2;
    
    ListNode *headNewList = p1->m_nValue < p2->m_nValue ? p1 : p2;
    ListNode *pNewList = NULL;
    ListNode *prevNewList = NULL;
    
    while(p1 != NULL && p2 != NULL){
        if(p1->m_nValue < p2->m_nValue){
            ListNode * temp = p1 -> m_pNext;
            pNewList = p1;
            if(prevNewList != NULL){
                prevNewList -> m_pNext = pNewList;    
            }
            pNewList -> m_pNext = NULL;
            prevNewList = pNewList;
            p1 = temp;
        }else{
            ListNode * temp = p2 -> m_pNext;
            pNewList = p2;
            if(prevNewList != NULL){
                prevNewList -> m_pNext = pNewList;    
            }
            pNewList -> m_pNext = NULL;
            prevNewList = pNewList;
            p2 = temp;
        }
    }
    if(p1 != NULL){
        pNewList -> m_pNext = p1;
    }else{
        pNewList -> m_pNext = p2;
    }
    
    return headNewList; 
}

书上用递归做的,代码:

ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
    if(pHead1 == NULL)
        return pHead2;
    else if(pHead2 == NULL)
        return pHead1;

    ListNode* pMergedHead = NULL;

    if(pHead1->m_nValue < pHead2->m_nValue)
    {
        pMergedHead = pHead1;
        pMergedHead->m_pNext = Merge(pHead1->m_pNext, pHead2);
    }
    else
    {
        pMergedHead = pHead2;
        pMergedHead->m_pNext = Merge(pHead1, pHead2->m_pNext);
    }

    return pMergedHead;
}

 

posted on 2014-01-13 04:39  Felix Fang  阅读(142)  评论(0)    收藏  举报

导航