重排链表相关联系

海康的面试:应该跟简历提到的知识点相关。

leetcode 原题:大意:

L0->L1->L2->L3->...->Ln-1->Ln;

调整为:L0->Ln->L1->Ln-1->L2->Ln-2->...;

思路:

1 通过快慢指针,将链表从中间分开,慢指针所在链表为newList1、慢指针的下一个节点开始的链表为newList2;

2 将newList2链表翻转;

3 将翻转后的newList2 与 newList1进行合并

涉及知识点:快慢指针、翻转链表、合并链表。

***********************************************************************************************************

翻转链表的两种写法:

核心:创建三个节点,一个亚节点、一个用来连接新表的节点、一个用来移动的节点。

第一种:

ListNode*phead=NULL;
ListNode* reverseList(ListNode* head) {
	ListNode* curNode = head;
	ListNode* nextNode=NULL;
	while (curNode) {
		nextNode = curNode->next;
		curNode->next = phead;
		phead = curNode;
		curNode = nextNode;
	}
	return phead;
}

第二种:

ListNode* dummyNode = NULL;
ListNode* reverseList2(ListNode* head) {
	ListNode* walkNode = head;
	ListNode* tmp = NULL;
	while (walkNode) {
		tmp = walkNode;
		walkNode = walkNode->next;
		tmp->next = dummyNode;
		dummyNode = tmp;
	}
	return dummyNode;
}

*************************************************************************************************************

合并链表:注意两个链表合并时,哪个链表在前

核心:创建五个节点,两个分别指向链表的头结点,用来移动、两个用来连接的节点、一个指向合并后头结点的节点

ListNode*ans=NULL;
ListNode* mergeList(ListNode* newNode1, ListNode* newNode2) {
	ListNode* tmp1 = newNode1;
	ans = tmp1;
	ListNode* tmp2 = newNode2;

	while (newNode1||newNode2) {
		if (newNode1) {
			newNode1 = newNode1->next;
			tmp1->next = tmp2;
			tmp1 = newNode1;
		}
		if (newNode2) {
			newNode2 = newNode2->next;
			tmp2->next = tmp1;
			tmp2 = newNode2;
		}
	}
	return ans;
}

*************************************************************************************************************

答案:任意构造两个链表后,进行翻转和合并。非原题答案。

#include<iostream>
#include<vector>
using namespace std;
struct ListNode {
	int val;
	ListNode* next;
	ListNode(int x) :val(x), next(nullptr) {};
};
ListNode* head1 = new ListNode(-1);
ListNode* head2 = new ListNode(-1);

ListNode* creatNode(int val) {
	ListNode* newNode = new ListNode(val);
	return newNode;
}
void creatList(int val,ListNode*head) {
	ListNode* newNode = creatNode(val);
	ListNode* curNode = head;
	while (curNode->next != NULL) {
		curNode = curNode->next;
	}
	curNode->next = newNode;
	
}
void printList(ListNode* head) {
	ListNode* findNode = head;
	while (findNode) {
		cout << findNode->val;
		findNode = findNode->next;
	}
	return;
}
ListNode* phead = NULL;
ListNode* ans = NULL;
ListNode* reverseList(ListNode* head) {
	ListNode* curNode = head;
	ListNode* nextNode=NULL;
	while (curNode) {
		nextNode = curNode->next;
		curNode->next = phead;
		phead = curNode;
		curNode = nextNode;
	}
	return phead;
}
/*
ListNode* dummyNode = NULL;
ListNode* reverseList2(ListNode* head) {
	ListNode* walkNode = head;
	ListNode* tmp = NULL;
	while (walkNode) {
		tmp = walkNode;
		walkNode = walkNode->next;
		tmp->next = dummyNode;
		dummyNode = tmp;
	}
	return dummyNode;
}*/
ListNode* mergeList(ListNode* newNode1, ListNode* newNode2) {
	ListNode* tmp1 = newNode1;
	ans = tmp1;
	ListNode* tmp2 = newNode2;

	while (newNode1||newNode2) {
		if (newNode1) {
			newNode1 = newNode1->next;
			tmp1->next = tmp2;
			tmp1 = newNode1;
		}
		if (newNode2) {
			newNode2 = newNode2->next;
			tmp2->next = tmp1;
			tmp2 = newNode2;
		}
	}
	return ans;
}
int main() {
	 creatList(1,head1);
	 creatList(2,head1);
	 creatList(3,head1);
	 creatList(4,head1);
	 cout << "The first List:" << endl;
	 printList(head1->next);
	 cout << endl;
	 cout << "reverse List:"<<endl;
	 reverseList(head1->next);
	 printList(phead);
	 cout << endl;
	 creatList(5,head2);
	 creatList(6,head2);
	 creatList(7,head2);
	 creatList(9,head2);
	 cout << "The second List:" << endl;
	 printList(head2->next);
	 cout << endl;
	 cout << "merge List:" << endl;
	 mergeList(head2->next,phead);
	 printList(ans);
	 cout << endl;
	/*cout << "reverse List twice:" << endl;
	 reverseList2(ans);
	 printList(dummyNode);*/
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值