海康的面试:应该跟简历提到的知识点相关。
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;
}