题目描述:
输入两个单调递增的链表,输出两个链表合成后的链表,要求合成后的链表满足单调不减规则。
1、分析
已知输入的两个链表递增有序,要使输出的链表依然递增有序,可以依次从输入的两个链表中挑选最小的元素插入到输出的链表尾部,便可实现输出链表递增有序。
2、数据结构定义
struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) {} };
3、递归实现
/*递归实现合并两个排序链表*/ ListNode* Merge(ListNode* pHead1, ListNode* pHead2) { if(pHead1 == NULL) return pHead2; if(pHead2 == NULL) return pHead1; if(pHead1->val < pHead2->val) { pHead1->next = Merge(pHead1->next, pHead2); return pHead1; } else { pHead2->next = Merge(pHead1, pHead2->next); return pHead2; } }
4、非递归实现:
/*非递归实现合并两个排序链表*/ ListNode* Merge(ListNode* pHead1, ListNode* pHead2) { ListNode *pHead = new ListNode(0); ListNode *p = pHead; while(pHead1 != NULL && pHead2 != NULL) { if(pHead1->val < pHead2->val) { p->next = pHead1; pHead1 = pHead1->next; } else { p->next = pHead2; pHead2 = pHead2->next; } p = p->next; } if(pHead1 != NULL) { p->next = pHead1; } if(pHead2 != NULL) { p->next = pHead2; } return pHead->next; }
5、总结
这道题使对单链表操作比较经典的题目,无论是考研还是面试出现的概率都非常高。题目的思路较为简单,编码实现稍微难点,难度虽不大,但能考察编码基础功力和对单链表的深一层的理解,所以须熟练掌握。