题目:
输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。 要求:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n) 如输入{1,3,5},{2,4,6}时,合并后的链表为{1,2,3,4,5,6},所以对应的输出为{1,2,3,4,5,6},转换过程如下图所示:
解题思路:
题目中有很重要的一个信息是:两个链表都是递增的。 说明最终合成的列表的第一个结点,一定是两个链表的头结点中较小的那个。而结果链表接下来的结点,应该是两个链表接下来的结点中较小的结点。 根据这些信息我们便可以编写代码了。
函数:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2) {
ListNode* list=new ListNode(0);//初始化一个val为0,next为null的结点,作为结果链表的头结点。
ListNode* cur=list;//cur需要随着过程的进行而变化。list不会,最终返回list->next,最终链表。
while(pHead1 && pHead2){
if(pHead1->val<pHead2->val){
cur->next=pHead1;
pHead1=pHead1->next;
}else{
cur->next=pHead2;
pHead2=pHead2->next;
}
cur=cur->next;
}
//将两个链表中剩余的部分连接到结果链表中
cur->next=pHead1?pHead1:pHead2;
return list->next;
}
};
|