设计思想:
新建带表头的空表
h3
。选择两个临时指针
p=h1->next
和
q=h2->next
,即
p
和
q
先分别指向两链表的第一个数据节点。然后分
别比较
p
和
q
节点上数据的大小,通过头插法插入
h3
,依次递归直
到
h1
或
h2
的数据元素完全插入
h3
。最后将未插入的
h2
或
h1
剩余
节点依次采用头插法插入
h3
即可。
最后的
h1
和
h2
成为空表。
p=h1->next; q=h2->next; h3=new singlelist();
while(p&&q)
if(p->data < q->data){
r=p->next; p->next=h3->next; h3->next=p; p=r;
} //将 p 指向的(较小)元素插入到 h3 表头后
else{
r=q->next; q->next=h3->next; h3->next=q; q=r;
} //将 q 指向的(较小)元素插入到 h3 表头后
if(q)p=q; //p 指向剩余的链表元素
while(p){
r=p->next; p->next=h3->next; h3->next=p; p=r;
} //将剩余的链表元素用头插法插入 h3
以上最坏的情况是所有元素都进行了比较,时间复杂度是
𝑂(𝑚 + 𝑛)
,如果考虑移动次数,也是
𝑂(𝑚 + 𝑛)
,所以最终时间复杂
度是
𝑂(𝑚 + 𝑛)
或
𝑂(max(𝑚, 𝑛))