備戰秋招——算法與數據結構(7)

在這裏插入圖片描述

● 請你手寫代碼,如何合併兩個有序鏈表

參考回答:

class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if(l1 == NULL)
{
return l2;
}
if(l2 == NULL)
{
return l1;
}
if(l1->val < l2->val)
{
l1->next=mergeTwoLists(l1->next,l2);
return l1;
}
else
{
l2->next=mergeTwoLists(l1,l2->next);
return l2;
}
}
};

● 手寫代碼:反轉鏈表

參考回答:

Void reversal_list(mylist * a_list)
{
mylist * forward_node = nullptr;
mylist * cur_node = a_list->next;
mylist* next_node = cur_node->next;
if(cur_node == nullptr)
{
return ;
}
while(1)
{
cur_node->next = forward_node;
forward_node = cur_node;
cur_node = next_node;
if(cur_node == nullptr)
{
break;
}
next_node = cur_node->next;
}
a_list->next = forward_node;
}

● 判斷一個鏈表是否爲迴文鏈表,說出你的思路並手寫代碼

參考回答:
思路:使用棧存儲鏈表前半部分,然後一個個出棧,與後半部分元素比較,如果鏈表長度未知,可以使用快慢指針的方法,將慢指針指向的元素入棧,然後如果快指針指向了鏈表尾部,此時慢指針指向了鏈表中間

bool is_palindromic_list2(mylist *a_list)
{
if(a_list == nullptr)
{
return false;
}
stack<int>list_value;
mylist * fast =a_list;
mylist *slow =a_list;
while(fast->next!=nullptr && fast->next->next!=nullptr)
{
list_value.push(slow->next->value);
slow = slow->next;
fast = fast->next->next;
}
cout<<"middle elem value is "<<slow->next->value<<endl;
if(fast->next != nullptr)
{
cout<<"the list has odd num of node"<<endl;
slow =slow->next;
}
int cur_value;
while(!list_value.empty())
{
cur_value = list_value.top();
cout<<"stack top value is"<<cur_value<<endl;
cout<<"list value is "<<slow->next->value<<endl;
if(cur_value != slow->next->value)
{
return false;
}
list_value.pop();
slow = slow->next;
}
return true;
}

● 請你手寫鏈表反轉

參考回答

struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :val(x), next(NULL) {}
}
ListNode* ReverseList(ListNode* pHead)
{
if(!pHead||!pHead->next)return pHead;
ListNode *pre=nullptr;
ListNode *p=pHead;
ListNode *next=pHead->next;
while(p)
{
p->next=pre;
pre=p;
p=next;
if(next)
next=next->next;
}
return pre;
}

● 請問什麼是單向鏈表,如何判斷兩個單向鏈表是否相交

參考回答:
考察點:數據結構,算法
公司:百度

1、單向鏈表

單向鏈表(單鏈表)是鏈表的一種,其特點是鏈表的鏈接方向是單向的,對鏈表的訪問要通過順序讀取從頭部開始;鏈表是使用指針進行構造的列表;又稱爲結點列表,因爲鏈表是由一個個結點組裝起來的;其中每個結點都有指針成員變量指向列表中的下一個結點。

列表是由結點構成,head指針指向第一個成爲表頭結點,而終止於最後一個指向nuLL的指針。
在這裏插入圖片描述
2、判斷兩個鏈表是否相交

1)方法1:

鏈表相交之後,後面的部分節點全部共用,可以用2個指針分別從這兩個鏈表頭部走到尾部,最後判斷尾部指針的地址信息是否一樣,若一樣則代表鏈表相交!

2)方法2:

可以把其中一個鏈表的所有節點地址信息存到數組中,然後把另一個鏈表的每一個節點地址信息遍歷數組,若相等,則跳出循環,說明鏈表相交。進一步優化則是進行hash排序,建立hash表。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章