LeeCode 21.合并两个有序链表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 

示例1:

输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]

示例 2:

输入:l1 = [], l2 = []
输出:[]

示例 3:

输入:l1 = [], l2 = [0]
输出:[0]

提示:

  • 两个链表的节点数目范围是 [0, 50]
  • -100 <= Node.val <= 100
  • l1 和 l2 均按 非递减顺序 排列  

代码: 

先定义链表数据结构,在头文件dataDefine.h

#ifndef _DATA_DEFINE_H
#define _DATA_DEFINE_H

namespace data_define {
	//  Definition for singly-linked list.
	struct ListNode {
		int val;
		struct ListNode* next;
	};
}

#endif

功能代码:

struct data_define::ListNode* mergeTwoLists(struct data_define::ListNode* list1, struct data_define::ListNode* list2) { // leecode 21. 合并两个有序链表
	if (list1 == NULL)
		return list2;
	if (list2 == NULL)
		return list1;
	struct data_define::ListNode* list = NULL;
	struct data_define::ListNode* last = NULL; // 记录链表尾部

	for (;list1 != NULL || list2 != NULL;) {
		if (list1 == NULL) {
			last->next = list2;
			//printf("list1 == NULL\n");
			//printListNode(list);
			break;
		}
		if (list2 == NULL) {
			last->next = list1;
			//printf("list2 == NULL\n");
			//printListNode(list);
			break;
		}

		//printf("list1: %p, ", list1);
		//printf("list2: %p\n", list2);

		// 调试
		//printf("list1 val: %d, ", list1->val);
		//printf("list2 val: %d\n", list2->val);

		struct data_define::ListNode* next = NULL;
		struct data_define::ListNode* minListNode = (list1->val < list2->val) ? list1 : list2;
		
		if (minListNode == NULL) { // 不可能为空指针,但是不判空编译不过
			break;
		}
		if (list == NULL) {
			list = minListNode;
			last = list;
		}
		else {
			last->next = minListNode;
			last = minListNode;
		}
		next = minListNode->next;
		minListNode->next = NULL; // minListNode和它的下一个节点段开联系
		if (list1->val < list2->val) {
			list1 = next; // list1 变为它的下一个节点
		}
		else {
			list2 = next;
		}
		//printf("list1 and list2 not null \n");
		//printListNode(list);
	}

	return list;
}

测试代码:

void testleeCode21() {
	struct data_define::ListNode node1;
	struct data_define::ListNode node2;
	struct data_define::ListNode node4;
	node1.val = 1;
	node2.val = 2;
	node4.val = 4;
	node1.next = &node2;
	node2.next = &node4;
	node4.next = NULL; // 非常重要,否则值是随机的

	struct data_define::ListNode node1_;
	struct data_define::ListNode node3_;
	struct data_define::ListNode node4_;
	node1_.val = 1;
	node3_.val = 3;
	node4_.val = 4;
	node1_.next = &node3_;
	node3_.next = &node4_;
	node4_.next = NULL;

	struct data_define::ListNode* newNode = mergeTwoLists(&node1, &node1_);

	// 打印结果:
	printListNode(newNode);
}
void printListNode(struct data_define::ListNode* node) {
	printf("[");
	int isFirst = 1;
	for (;node != NULL;) {
		if (!isFirst) {
			printf(",");
		}
		else {
			isFirst = 0;
		}
		printf("%d", node->val);
		node = node->next;
	}
	printf("]\n");
}

打印调用结果如下:

ok,结果正确。

总结:链表ListNode如果没有下一个节点,必须显式的将其next节点置为空指针NULL,否则会被赋值为一个奇怪的值,然后调用过程中报错:引发了异常:读取访问权限冲突。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值