浙大oj平台pta 02-线性结构1 两个有序链表序列的合并 (疑问待回答)(15 分)

List Merge(List L1, List L2)//list是一个node类型的指针 
{
	List  P , tmp , tmp1 , tmp2;
	P = (List)malloc(sizeof(struct Node));
	P->Next = NULL;
	L1 = L1->Next; L2 = L2->Next;
	tmp = P;
	while(L1 && L2){
		if(L1->Data <= L2->Data){
			tmp->Next = L1;
			tmp = L1;
			L1 = L1->Next;
		}
		else{
			tmp->Next = L2;
			tmp = L2;
			L2 = L2->Next;
		}
	}
	tmp->Next = L1 ? L1 : L2;
	L1->Next = NULL;
	L2->Next = NULL;
	return P;
}

上述代码中L1和L2的next指针已经为null,再次置为null会报错

List Merge(List L1, List L2)
{
	List  P , tmp , tmp1 , tmp2;
	P = (List)malloc(sizeof(struct Node));
	P->Next = NULL;
	tmp1 = L1->Next; tmp2 = L2->Next;
	tmp = P;
	while(tmp1 && tmp2){
		if(tmp1->Data <= tmp2->Data){
			tmp->Next = tmp1;
			tmp = tmp1;
			tmp1 = tmp1->Next;
		}
		else{
			tmp->Next = tmp2;
			tmp = tmp2;
			tmp2 = tmp2->Next;
		}
	}
	tmp->Next = tmp1 ? tmp1 : tmp2;
	L1->Next = NULL;
	L2->Next = NULL;
	return P;
}

不知道为什么在函数体内对L1和L2操作会影响到函数体外的L1L2。请教后再回答:
(还未请教老师):初步的想法是:直接对L1和L2操作时,可以正常得到合并后的链表,oj不过的原因是L1和L2被要求为NUll,而在代码1中,不能使L1和L2返回后的值变为NULL,其原因可以能是:直接使用L1和L2遍历链表后,再对L1->next=null;不再是头结点了,而主函数中对L1和L2的操作是对头结点的操作,那时的L1和L2未被置为null(在Merge函数最后的null操作是起作用的,只不过没有作用到头节点上。)
疑问:代码1中。范例的退出条件是L1为空,在Merge末尾对L1进行L1->next = null;操作会报错,是不是因为已经为null的指针,无法重复null操作,待回答!

你可能感兴趣的:(PAT乙级)