面试题目--合并两个有序单链表

题目

一个面试题目,将两个递增的有序单链表合并成一个递增单链表。有两种理解:
1、new一个单链表,返回新的头节点
2、在原链表上操作,返回新的头节点
第一种实现较为简单,只需要从头比较链表的节点,将较小的插入新链表,被插入的节点指针后移,直至遍历整个链表。而在原表操作就相对复杂一点,主要有三部分:首先确定返回的头节点,中间遍历重定向链表指针,当某一个链表先遍历完之后末尾的处理。在原表操作的代码如下:

#include <iostream>
using namespace std;

struct node{
	int val;
	node *next;
	node(int a) :val(a), next(nullptr) {}
};

node* sortnode(node* head1, node* head2){
	node *newhead;
	node *prenode1 = head1;
	node *prenode2 = head2;
	head1 = head1->next;
	head2 = head2->next;
	if (prenode1->val <= prenode2->val){
		newhead = prenode1;
	}
	else if (prenode1->val > prenode2->val){
		newhead = prenode2;
	}
	while (head1 != nullptr && head2 != nullptr){
		if (prenode1->val <= prenode2->val){
			if (head1->val >= prenode2->val){
				prenode1->next = prenode2;
				prenode1 = head1;
				head1 = head1->next;
				continue;
			}
			prenode1 = head1;
			head1 = head1->next;
		}
		if (prenode2->val <= prenode1->val){
			if (head2->val >= prenode1->val){
				prenode2->next = prenode1;
				prenode2 = head2;
				head2 = head2->next;
				continue;
			}
			prenode2 = head2;
			head2 = head2->next;
		}
	}	
	if (head2 == nullptr && head1 != nullptr){
		while (prenode1->val <= prenode2->val){
			if (head1->val >= prenode2->val){
				prenode1->next = prenode2;
				prenode1 = head1;
				head1 = head1->next;
				break;
			}
			prenode1 = head1;
			head1 = head1->next;
		}
		prenode2->next = prenode1;
	}
	else if (head1 == nullptr && head2 != nullptr){
		while (prenode2->val <= prenode1->val){
			if (head2->val >= prenode1->val){
				prenode2->next = prenode1;
				prenode2 = head2;
				head2 = head2->next;
				break;
			}
			prenode2 = head2;
			head2 = head2->next;

		}
		prenode1->next = prenode2;
	}

	else{
		if (prenode1->val <= prenode2->val){
			prenode1->next = prenode2;
		}
		else{
			prenode2->next = prenode1;
		}
	}
	return newhead;
}

void print(node *head){
	node *cur = head;
	while (1){
		if (cur != nullptr){
			cout << cur->val << " ";
			cur = cur->next;
		}
		else{
			cout << endl;
			break;
		}
	}
}

int main() {
	node *head1 = new node(3);
	node *cur = head1;
	for (int i = 4; i < 4; ++i){
		cur->next = new node(2 * i);
		cur = cur->next;
	}
	node *head2 = new node(3);
	cur = head2;
	for (int i = 5; i < 5; ++i){
		cur->next = new node(i);
		cur = cur->next;
	}
	print(head1);
	print(head2);
	node *head = sortnode(head1, head2);
	print(head);
	return 0;
}

运行结果:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
总感觉实现很复杂,如果有好的解决方法,欢迎评论区讨论。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值