日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

算法-链表常用算法

發布時間:2023/12/18 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法-链表常用算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

常見算法:

1.鏈表逆序

2.鏈表求交點

3.鏈表求環

4.鏈表劃分

5.復雜鏈表的復制

6-a.2個排序鏈表歸并

6-b.k個排序鏈表歸并

?


?鏈表定義:

/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/

?

1.鏈表逆序

class Solution { public:ListNode* reverseList(ListNode* head) {ListNode *next=NULL; ListNode *new_head=NULL; while(head){ next=head->next; head->next=new_head; new_head=head; head=next; } return new_head; } };

new_head是新鏈表的頭指針,next是為了記錄下一個要反轉的結點指針。


?

2.鏈表求交點

class Solution { public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {std::set<ListNode*> node_set;while(headA){node_set.insert(headA);}while(headB){if(node_set.find(headB)!=node_set.end()){return headB;}}return NULL;} }

用stl 的set,時間復雜度nlogn,判定超時

int get_length(ListNode *head){int len=0;while(head){len++;head=head->next;}return len; } ListNode * get_same_node(int long_len,int short_len,ListNode *head){int delta=long_len-short_len;while(delta--){head=head->next;}return head; } class Solution { public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {int len_A=get_length(headA);int len_B=get_length(headB);if(len_A>len_B){headA=get_same_node(len_A,len_B,headA);}else{headB=get_same_node(len_B,len_A,headB);}while(headA){if(headA==headB){return headA;}headA=headA->next;headB=headB->next;}return NULL;} };

先求出兩個鏈表長度,然后對齊指針。時間復雜度O(n)


?3.鏈表求環

class Solution { public:bool hasCycle(ListNode *head) {ListNode *fast=head;ListNode *slow=head;while(fast && fast->next){fast=fast->next->next;slow=slow->next;if(fast==slow) return true;}return false;} };

快慢指針。


?

4.劃分鏈表

class Solution { public:ListNode* partition(ListNode* head, int x) {ListNode moreNode(0),lessNode(0);ListNode *more=&moreNode,*less=&lessNode;while(head){if(head->val < x){less->next=head;less=head; }else{more->next=head;more=head;}head=head->next;} less->next=moreNode.next;more->next=NULL;//注意尾指針清空!!!return lessNode.next;} };

利用兩個頭節點掛上多于x和少于x的節點,最后修改指針,注意尾指針需要清空。


?

5.復雜鏈表的復制

?

class Solution { public:RandomListNode *copyRandomList(RandomListNode *head) {if(head==NULL) return NULL;unordered_map<RandomListNode*,RandomListNode*> m;RandomListNode headNode(0);RandomListNode *cur=&headNode;RandomListNode *old_cur=head;while(old_cur){RandomListNode *temp=new RandomListNode(old_cur->label);cur->next=temp;m.insert({old_cur,temp});cur=cur->next;old_cur=old_cur->next;}cur->next=NULL;cur=headNode.next;old_cur=head;while(cur){cur->random=m[old_cur->random];cur=cur->next;old_cur=old_cur->next;}return headNode.next;} };

old_cur為原鏈表的遍歷指針,cur為新鏈表的遍歷指針

?


?6-a.2個排序鏈表的歸并

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

?6-b.k個排序鏈表合并

class Solution { public:ListNode* mergeKLists(vector<ListNode*>& lists) {int len=lists.size();if(len==0) return NULL;if(len==1) return lists[0];if(len==2) return mergeTwoLists(lists[0],lists[1]);int mid=len/2;vector<ListNode *> sub_list1,sub_list2;for(int i;i<mid;i++){sub_list1.push_back(lists[i]);}for(int i=mid;i<len;i++){sub_list2.push_back(lists[i]);}ListNode *l1=mergeKLists(sub_list1);ListNode *l2=mergeKLists(sub_list2);return mergeTwoLists(l1,l2);} };

mergeTwoLists函數是上面的。時間復雜度O(nklogk).


?

其他算法題型:

1.刪除指定節點 

class Solution { public:void deleteNode(ListNode* node) {node->val=node->next->val;node->next=node->next->next;} };

給定的是要刪除的節點的指針,要刪除該節點,由于無法獲取前面節點的next,無法通過修改該next指向后面的節點。

這里將該節點的值用其后面節點的值替換,再刪除后面的節點,達到等效的作用。

2.獲取中間節點

  描述:給定一個帶有頭結點?head?的非空單鏈表,返回鏈表的中間結點。如果有兩個中間結點,則返回第二個中間結點。

class solution{public:ListNode *getMiddleNode(ListNode *head){ListNode *fast=head;ListNode *slow=head;while(fast != NULL && fast->next != NULL){fast=fast->next->next;slow=slow->next;}return slow;} }

快慢指針法。

另一種是將節點指針輸入到數組,再利用數組的隨機訪問特性。而隨機訪問正是鏈表的弱點。

?

轉載于:https://www.cnblogs.com/chendaniu/p/10208002.html

總結

以上是生活随笔為你收集整理的算法-链表常用算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 女教师高潮黄又色视频 | 艳母免费在线观看 | 成 人免费va视频 | 在线免费观看麻豆 | 亚洲中国色老太 | 日韩欧美四区 | 天天干天天操天天射 | 国产一区影院 | 91成人毛片 | 成人mv | www.日韩在线观看 | 无码一区二区三区 | 极品尤物在线观看 | 日本在线不卡一区 | 就去吻亚洲 | 久久久久亚洲av无码专区首jn | 国内成人精品 | 一级绝黄 | 三级免费毛片 | 色猫咪av | 在线看毛片网站 | 日韩色图一区 | 69福利网| av片子在线观看 | 国产精品视频区 | 美女高潮黄又色高清视频免费 | 国产视频污在线观看 | 网站在线观看你懂的 | 天天色宗合 | 免费在线看黄的网站 | 最新中文字幕在线视频 | www国产在线观看 | 欧美二区三区 | 国产夫妻在线观看 | 国产乱码精品一区二区三区亚洲人 | 色综合天 | 超碰97在线播放 | 欧美一区二区三区不卡视频 | 一起操17c | 91日韩 | 国产成人aaa| 亚洲毛片av | 国产在线视频资源 | 国产精品高潮呻吟久久av黑人 | 国产精品无码一区二区三 | 亚洲欧美日韩系列 | 中文在线亚洲 | 9l蝌蚪porny中文自拍 | 久久久久久久久久综合 | 国产乱子伦精品无码码专区 | 免费超碰在线 | 男人天堂avav| 欧美性生交xxxxx久久久缅北 | 久久精品aaaaaa毛片 | 亚洲一级片免费 | 91精品999| 日韩一级欧美一级 | 亚洲无吗av | 九九视频免费 | 亚洲熟女乱色一区二区三区 | 九色国产视频 | 国产激情av | 无码h黄肉3d动漫在线观看 | 国产毛片一区二区三区 | 黄色av软件 | 国产视频欧美 | 国产愉拍 | www.中文字幕在线观看 | 自拍偷拍亚洲欧洲 | 中文字幕欲求不满 | 日本韩国中文字幕 | 黄色小说在线看 | 永久免费54看片 | 中文字幕第一区 | 亚洲精品88 | 国内一区二区视频 | 国产一区二区三区播放 | 久久成人午夜 | 亚洲午夜在线观看 | 国产精品99无码一区二区 | 一色桃子juy758在线播放 | 中文在线a√在线8 | 久久三级视频 | 天天干视频在线观看 | 欧美激情一区二区三区四区 | 精彩视频一区二区 | 国产精品91在线观看 | 国产青青草 | 中文字幕欧美人妻精品一区蜜臀 | 欧美日韩中文国产 | www性欧美| 伦理一级片 | 深夜视频一区二区 | 91www在线观看 | 国产又黄又大又粗视频 | 日韩精品在线网站 | 欧美成人精品二区三区99精品 | 物业福利视频 | av大片在线免费观看 |