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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

单链表——判断两个单链表(无头节点)是否相交,如果相交,返回单链表的第一个结点

發布時間:2024/4/17 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 单链表——判断两个单链表(无头节点)是否相交,如果相交,返回单链表的第一个结点 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本博客主要記錄兩個解法:
1.求兩個單鏈表的節點個數,消除結點個數不同帶來的影響,兩個指針一起走,相遇即相交點。
2.數學方式求解。

一、求結點個數,消除結點個數不同帶來的影響,倆指針同步走

思路:兩個單鏈表相從相交的第一個結點開始,后面的結點都共享,所以兩個單鏈表的節點個數之差就是相交的結點之前,兩個單鏈表的結點個數之差,我們只需要將兩個單鏈表結點個數之差算出來,然后消除結點個數不同帶來的影響,讓p1和p2同時向后走,那么相遇的時候,即相交的第一個結點,如下圖:

p1和p2分別從兩個單鏈表的如下位置同時向后走,那么p1和p2相遇時的結點即為相交的第一個節點(如果不相交,那么p1和p2最終都會指向NULL)

代碼:

//不相交,返回NULL,相交返回第一個相交的結點 ListNode* FindTheSameNode(ListNode* head1, ListNode* head2) {if (head1 == NULL || head2 == NULL)//兩個單鏈表都是空的{return NULL;}ListNode* p1 = head1;int num1 = 0;//記錄第一個單鏈表的節點個數ListNode* p2 = head2;int num2 = 0;//記錄第二個單鏈表的結點個數while (p1 != NULL)//計算第一個單鏈表的節點個數{++num1;p1 = p1->next;}while (p2 != NULL)//計算第二個單鏈表的節點個數{++num2;p2 = p2->next;}p1 = head1;p2 = head2;//讓p1或者p2把節點個數的差值的影響去除while (num1 > num2){p1 = p1->next; num1--;}while (num2 > num1){p2 = p2->next;num2--;}while (p1 != p2)//如果相交,則退出時p1 == p2,指向"相交的第一個結點",如果不相交,則最后p1 == p2 == NULL{p1 = p1->next;p2 = p2->next;}return p1; }

二、數學思維

思路:
如下圖,假設相交的結點之前第一個單鏈表的結點個數為a,第二個結點個數為b,相交部分結點個數為c
那么p1(==head1)走完整個單鏈表,走的距離為:a+c
那么p2(==head2)走完整個單鏈表,走的距離為:b+c
如果我們讓p1走單鏈表的尾之后,從head2繼續向后走,p2走到單鏈表的尾之后從head1繼續向后走,那么最后p1和p2到相交的第一個結點一定相遇,因為它們倆這個時候走的總距離都為a+b+c+1,一起走的,所以p1和p2在單鏈表相交的第一個結點的位置一定相遇。如果單鏈表沒有相交,那么最后p1和p2都會指向NULL。

代碼:

ListNode* FindTheSameNode(ListNode* head1, ListNode* head2) {if (head1 == NULL || head2 == NULL){return NULL;}ListNode* p1 = head1;ListNode* p2 = head2;while (p1 != p2){p1 = p1 == NULL ? head2 : p1->next;p2 = p2 == NULL ? head1 : p2->next;}return p1;//如果head1和head2相交,則p1(p2)為第一個相交的結點,如果不相交,那么p1 == p2 == NULL }

總結

以上是生活随笔為你收集整理的单链表——判断两个单链表(无头节点)是否相交,如果相交,返回单链表的第一个结点的全部內容,希望文章能夠幫你解決所遇到的問題。

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