合并两个排序的链表_牛客题霸_牛客网 (nowcoder.com)
输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。
数据范围: 0≤n≤1000,−1000≤节点值≤1000
要求:空间复杂度 O(1),时间复杂度 O(n)
如输入{1,3,5},{2,4,6}时,合并后的链表为{1,2,3,4,5,6},所以对应的输出为{1,2,3,4,5,6},转换过程如下图所示:
或输入{-1,2,4},{1,3,4}时,合并后的链表为{-1,1,2,3,4,4},所以对应的输出为{-1,1,2,3,4,4},转换过程如下图所示:
示例1:
输入:{1,3,5},{2,4,6}
返回值:{1,2,3,4,5,6}
示例2:
输入:{},{}
返回值:{}
示例3:
输入:{-1,2,4},{1,3,4}
返回值:{-1,1,2,3,4,4}
首先我们需要对两个表进行判断。一旦有一个表为空,则直接返回另一个表的头结点即可,如果两个链表都为空,则返回NULL。
然后就是两个表都不为空的情况下如何去合并两个表,我们可以定义三个辅助指针pa、pb、pc,分别用于遍历需要合并的两个链表还有合并成的第三个链表,还有定义一个头结点pHead3,同于最后返回结果。接着分别判断两个表的第一个结点,取小的一方作为合并后的头结点,也就是pHead3所要指向的结点。
然后就是对两个表同时进行遍历,然后判断当前pa和pb所指向的结点的值的大小,小者使pc指向它(合并),然后指针后移遍历下一个结点,一直到有一个表为空或者两个表都为空的情况则结束。
当有一个表为空时,则只需要将剩下的那个表的结点以尾插法插入C中即可,可以用while,也可以利用条件表达式(更为简便)
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param pHead1 ListNode类
* @param pHead2 ListNode类
* @return ListNode类
*/
ListNode* Merge(ListNode* pHead1, ListNode* pHead2) {
// write code here
if(pHead1==NULL&&pHead2!=NULL){ //如果表1为空 表2不为空则直接返回表2
return pHead2;
}else if(pHead1!=NULL&&pHead2==NULL){ //如果表2为空 表1不为空则直接返回表1
return pHead1;
}else if(pHead1==NULL&&pHead2==NULL){ //两个表都为空返回NUL
return NULL;
}else{
ListNode *pa,*pb,*pc,*q,*pHead3;
pa=pHead1;
pb=pHead2;
if(pa->val<=pb->val){
pc=pa;
pHead3=pc;
pa=pa->next;
}
else{
pc=pb;
pHead3=pc;
pb=pb->next;
}
while(pa&&pb){ //两表都不为空
if(pa->val<=pb->val){
pc->next=pa;
pc=pa;
pa=pa->next;
}
else{
pc->next=pb;
pc=pb;
pb=pb->next;
}
}
// while(pa){ //表1不为空
// q=pa->next;
// pa->next=NULL;
// pc->next=pa;
// pc=pa;
// pa=q;
// }
// while(pb){
// q=pb->next;
// pb->next=NULL;
// pc->next=pb;
// pc=pb;
// pb=q;
// }
pc->next=pa?pa:pb;
return pHead3;
}
}
};