面试题17: 合并两个排序的链表
题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。例如下图中的链表1和链表2,则合并之后的升序链表如链表3所示。
方法一:
从头遍历和比较两个链表
ListNode *merge1(ListNode *head1, ListNode *head2) {
if(head1 == NULL && head2 == NULL) { // 两个链表都为空
return NULL;
} else if(head1 == NULL) { // head1为空,直接然会head2
return head2;
} else if(head2 == NULL) {// head2为空,直接返回head1
return head1;
} else {
ListNode *head, *p1, *p2, *p3;
head = new ListNode(); // new一个节点,合并后链表的头结点
head->m_nValue = 0;
head->m_pNext = NULL;
p3 = head;
p1 = head1;
p2 = head2;
while(p1 != NULL && p2 != NULL) {
if(p1->m_nValue < p2->m_nValue) {
p3->m_pNext = p1;
p1 = p1->m_pNext;
} else {
p3->m_pNext = p2;
p2 = p2->m_pNext;
}
p3 = p3->m_pNext;
}
// 如果head1还有未遍历完
while(p1 != NULL) {
p3->m_pNext = p1;
p1 = p1->m_pNext;
p3 = p3->m_pNext;
}
// 如果head2还没有遍历完
while(p2 != NULL) {
p3->m_pNext = p2;
p2 = p2->m_pNext;
p3 = p3->m_pNext;
}
return head->m_pNext;
}
}
方法二:递归
ListNode *merge2(ListNode *head1, ListNode *head2) {
if(head1 == NULL && head2 == NULL) { // 两个链表都为空
return NULL;
} else if(head1 == NULL) { // head1为空,直接然会head2
return head2;
} else if(head2 == NULL) {// head2为空,直接返回head1
return head1;
} else {
ListNode *head = NULL;
if(head1->m_nValue < head2->m_nValue) {
head = head1;
head->m_pNext = merge2(head1->m_pNext, head2);
} else {
head = head2;
head->m_pNext = merge2(head1, head2->m_pNext);
}
return head;
}
}