LeetCode21:合并2个有序链表

在这里插入图片描述
链表已经有序,可使用双指针l1和l2,分别指向第一个和第二个链表。再设置一个指向新链表头节点的指针,以及维护一个指向新链表最后一个节点的指针。使用双指针遍历遍历两个链表,比较后将节点添加到新链表的末尾。

反思:知道要使用双指针,但是并未想到设置哨兵和尾指针(指向新链表)。一开始的思路是将第二个链表的节一 个一个插入到第一个链表中。所以插入有三种情况:(1)在表头(2)在中间(3)在表尾。麻烦且容易出错,方向出现错误。改变思维,把合并后的新链表当成第三个链表,问题就变为构建第三个链表。将第二个链表中的节点插入到第一个链表的方法舍弃,改用将合适的节点添加到新链表的中去,。即从两个链表中选出合适的节点添加到新链表的末尾。由此简化了步骤,思考起来也简单。最后就是处理剩下的节点。

struct ListNode {
	int val;
	struct ListNode* next;
};

struct ListNode* mergeTwoList(struct ListNode* l1,struct ListNode* l2){
	if(!l1||!l2)
		return NULL;
	if(l1==NULL)
		return l2;
	if(l2==NULL)
		return l1;	
	struct ListNode	*prehead,*tail;
	//prehead为哨兵,指向新链表
	prehead=(struct ListNode*)malloc(sizeof(struc ListNode));
	prehead->next=NULL;
	pre->head->val=0;
	
	//tail指向新链表的最后一个节点
	tail=prehead;
	
	//遍历比较l1和l2
	while(l1&&l2){
		if(l1->val<=l2->val){
			tail->next=l1;
			tail=l1;
			l1=l1-nwext;
		}
		else{
			tail->next=l2;
			tail=l2;
			l2=l2->next;
		}
	}
	//将剩下的链表节点链接起来
	if(l1!=NULL)
		tail->next=l1;
	if(l2!=NULL)
		tail->next=l2;
	l1=prehead->next;
	free(prehead);
	
	return l1;	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值