LeetCode21合并两个有序链表

21 篇文章 0 订阅
11 篇文章 0 订阅
这篇博客主要介绍了如何使用C++实现两个已排序链表的合并排序。通过定义一个新链表newhead作为返回值,和一个cur指针跟踪新链表当前节点,遍历两个输入链表,根据值大小决定将哪个节点添加到新链表。最后处理特殊情况,如一个链表为空时,将另一个链表作为结果。该方法确保了合并后的链表依然有序。
摘要由CSDN通过智能技术生成
class Solution {
public:
	ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
		ListNode* newhead = NULL;
		ListNode* cur = NULL;
		while (l1 != NULL && l2 != NULL) {
			if (l1->val <= l2->val) {
				newhead = newhead == NULL ? l1 : newhead;
				if (cur == NULL) {
					cur = l1;
				}
				else {
					cur->next = l1;
					cur = l1;
					
				}
				l1 = l1->next;
			}
			else {
				newhead = newhead == NULL ? l2 : newhead;
				if (cur == NULL) {
					cur = l2;
				}
				else {
					cur->next = l2;
					cur = l2;
					
				}
				l2 = l2->next;
			}
		}
		if (l1 == NULL && l2 == NULL) {
			return NULL;
		}
		if (l1 == NULL) {
			if (cur == NULL) {
				newhead = l2;
			}
			else {
				cur->next = l2;
			}
			
		}
		if (l2 == NULL) {
			if (cur == NULL) {
				newhead = l1;
			}
			else {
				cur->next = l1;
			}
			
		}
		return newhead;
	}
};

解题思路

分别用两个指针指向两个链表,取对应位置上的值进行比较,谁的值小就将谁接在新链表上,原链表上的指针同时向后移动,当有一个链表的指针到达结尾的时候,就将另一个链表接在新链表后面即可

代码实现细节

  1. 首先需要确认需要建立哪些变量,首先head1和head2题目中已经给出了,可以直接使用。新链表返回的时候,记录头节点的newhead;比较过程中,新链表上的当前指针cur用于不断连接新的节点。
  2. 首先分析给出的两个链表可能的情况
    1. 两个链表都有元素,那么就可以直接比较,直到某个链表为空
    2. 若两个链表都是空的,那么就无须排序,直接返回null就好了
    3. 若其中一个是空的,那么此刻直接返回另一组链表的头指针即可(此处的说明是在一开始的时候就判断某个链表是否为空,实际采用的是后面的做法,因为情况1后续的情况必然需要后续操作,在后续操作中加个判断就可以同时完成这两种情况),若将位置放在情况1之后再分析这种情况的时候,那么就需要判断cur是否发生了变化,如果仍然是null,说明没有进入情况1,直接返回另一个链表或者将newhead指向另一个链表头节点都可以,若是cur不是null,说明已经完成了情况1,此时将cur的后继接上另一个链表剩余的部分即可
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值