问题描述:
本题思路是将两个链表上的值进行比较,按顺序取下,插在总链表上,当某一条链表上的值取完之后,将另一条链表剩下的所有值插到到总链表的后面。
先初始化两个指针p和head,p用来将两个链表中的值插入到总链表上,head用来作为总链表的头结点返回。
struct ListNode* head;
struct ListNode* p=head;
然后对特殊情况进行检查:所给的链表中,某一个链表为空或两个链表都为空。当其中一个链表为空时,直接返回另一个链表即可。当两个链表都为空时,返回空。
if(!l1) return l2;
if(!l2) return l1;
if(!l1 && !l2) return NULL;
给head结点初始化,他应该是两个链表中最小的那个值,所以先比较这两个链表第一个值的大小,取较小的那个链表指针赋值给head。
if(l1->val>l2->val)
{
p=head=l2;
l2=l2->next;
}
else
{
p=head=l1;
l1=l1->next;
}
这里要明确一个概念,指针本身不能代表一整条链表,它只指向某一个结点,他储存某一个结点的val和*next属性的内存单元的地址,先用指针找到内存单元,再操作内存单元中的数据。所以给head赋值为l1或l2是将链表头结点的地址赋给head,即head和l1、l2指向的是同一个内存单元。
之后就可以逐个往head链表上插入值了,直至某一条链表上的值取完。
while(l1 && l2)
{
if(l1->val > l2->val)
{
p->next=l2;
l2=l2->next;
}
else
{
p->next=l1;
l1=l1->next;
}
p=p->next;
}
如果有其中一条链表还没有取完,那么将他连到总链表的后面。
if(!l1)
p->next=l2;
if(!l2)
p->next=l1;
最后返回头结点。因为之前给头结点赋值后,又赋给了p,所以p和head操作的是统一内存单元,所以p所连接的所有结点,实际都连接在head上。
return head;
-------------------------------------------------------------------------------------------------------------------------
合并两个有序数组的方法,先将两个数组中的数取出,按大小顺序放在总数组中,当有一个数组中的数被取完时,将另一个数组中剩下的数放到总数组中。
void merge(int* nums1, int m, int* nums2, int n) {
int i;
if(m==0)
{
for(i=0;i<n;i++)
printf("%d ",nums2[i]);
return;
}
if(n==0)
{
for(i=0;i<m;i++)
printf("%d ",nums1[i]);
return;
}
int c[m+n],j,nums[m];
for(i=0;i<m;i++)
nums[i]=nums1[i];
int up=0,down=0;
for(i=0;i<m+n;i++)
{
if(nums[up]<nums2[down])
{
c[i]=nums[up++];
if(up==m)
{
for(j=down;j<n;j++)
c[++i]=nums2[j];
break;
}
}
else
{
c[i]=nums2[down++];
if(down==n)
{
for(j=up;j<m;j++)
c[++i]=nums[j];
break;
}
}
}
for(i=0;i<m+n;i++)
printf("%d ",c[i]);
}