LeetCode合并两个有序链表及合并两个有序数组

问题描述:


      本题思路是将两个链表上的值进行比较,按顺序取下,插在总链表上,当某一条链表上的值取完之后,将另一条链表剩下的所有值插到到总链表的后面。

      先初始化两个指针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]);
}

猜你喜欢

转载自blog.csdn.net/q_m_x_d_d_/article/details/80204560