面试题 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; }
------------------------------------------------
Felix原创,转载请注明出处,感谢博客园!
posted on 2014-01-13 04:39 Felix Fang 阅读(142) 评论(0) 收藏 举报
浙公网安备 33010602011771号