题目:
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
链接:
思路:
第一种思路:创建一个新的链表,将两个链接不断合并到新的链表中,这样是不会修改输入参数的,但是这样会暴内存使用过大!
第二种思路:
1、确定最终返回链表为pHead1(事实上,可以通过比较两个链表头的数据的大小,让链表头数据小的链表作为返回链表)
2、考虑两个链表头的大小,如果pHead2的表头数据要小于pHead1的,则需要将pHead2的表头作为pHead1的表头,修改pHead1的指向
3、比较pHead1中当前链表遍历指针的下一个节点和pHead2的遍历指针的当前节点的大小,如果pHead2的遍历指针节点值要小,则将pHead2的遍历指针指向的节点插入到pHead1遍历指针的后面,调整pHead1的遍历指针为下一个节点即可
4、考虑遍历结束后,pHead2的遍历指针后面还有很多元素的情况
总的来说:就是将pHead2的小的元素不断添加到pHead1当前遍历位置处,否则,pHead1就往后面移动,直到找到一个比phead2遍历指针大的元素
代码:
1 /* 2 struct ListNode { 3 int val; 4 struct ListNode *next; 5 ListNode(int x) : 6 val(x), next(NULL) { 7 } 8 };*/ 9 class Solution { 10 public: 11 ListNode* Merge(ListNode* pHead1, ListNode* pHead2) 12 { 13 if(pHead1 == NULL && pHead2 == NULL){ 14 return NULL; 15 } 16 17 if(pHead1 == NULL){ 18 return pHead2; 19 } 20 21 if(pHead2 == NULL){ 22 return pHead1; 23 } 24 25 26 ListNode *pHead2Iter = pHead2; 27 if(pHead1->val > pHead2Iter->val){ 28 ListNode *tmpNode = pHead2Iter; 29 pHead2Iter = pHead2Iter->next; 30 tmpNode->next = pHead1; 31 pHead1 = tmpNode; 32 } 33 ListNode *pHead1Iter = pHead1; 34 while(pHead1Iter->next != NULL && pHead2Iter != NULL){ 35 if(pHead1Iter->next->val >= pHead2Iter->val){ 36 ListNode *tmpNode = pHead2Iter; 37 pHead2Iter = pHead2Iter->next; 38 tmpNode->next = pHead1Iter->next; 39 pHead1Iter->next = tmpNode; 40 } 41 pHead1Iter = pHead1Iter->next; 42 } 43 44 if(pHead2Iter != NULL){ 45 pHead1Iter->next = pHead2Iter; 46 } 47 48 return pHead1; 49 } 50 };
浙公网安备 33010602011771号