问题
题目:[合并两个排序的链表]
思路
传统merge的思路不说了,因为此时空间的复杂度是O(N). 主要说就地合并的思路。当然,这个题其实牛客的测试用例有问题,考虑不全面。 基本思想就是当p的当前值比q的当前值小的时候,q的上一个元素要指向p。当然,这有个前提是q的上一个元素不能指向pre_p,否则没有没有指向的意义。比如 1->3->5, 2->100->101。牛客没有考虑这种测试用例
代码
class Solution {
public:
ListNode
* Merge(ListNode
* pHead1, ListNode
* pHead2)
{
ListNode
* p
= pHead1;
ListNode
* q
= pHead2;
if(
!p
&& !q)
return NULL;
if(p
&& !q)
return p;
if(
!p
&& q)
return q;
ListNode
* p_pre
= NULL;
ListNode
* q_pre
= NULL;
while(p
&&q){
if( p
->val
< q
->val ){
if(q_pre
&& q_pre
->next
!= p_pre ){
q_pre
->next
= p;
}
p_pre
= p;
p
= p
->next;
}
else{
if(p_pre
&& p_pre
->next
!= q_pre ){
p_pre
->next
= q;
}
q_pre
= q;
q
= q
->next;
}
}
if(p) q_pre
->next
= p;
if(q) p_pre
->next
= q;
if(pHead1
->next
== pHead2)
return pHead1;
else return pHead2;
}
};