成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

數據結構與算法之鏈表相交,找交點

開發 前端 算法
給你兩個單鏈表的頭節點 headA 和 headB ,請你找出并返回兩個單鏈表相交的起始節點。如果兩個鏈表沒有交點,返回 null 。

[[441326]]

鏈表相交

力扣題目鏈接:https://leetcode-cn.com/problems/intersection-of-two-linked-lists-lcci

給你兩個單鏈表的頭節點 headA 和 headB ,請你找出并返回兩個單鏈表相交的起始節點。如果兩個鏈表沒有交點,返回 null 。

圖示兩個鏈表在節點 c1 開始相交:

題目數據 保證 整個鏈式結構中不存在環。

注意,函數返回結果后,鏈表必須 保持其原始結構 。

示例 1:

示例 2:

示例 3:

思路

簡單來說,就是求兩個鏈表交點節點的指針。這里同學們要注意,交點不是數值相等,而是指針相等。

為了方便舉例,假設節點元素數值相等,則節點指針相等。

看如下兩個鏈表,目前curA指向鏈表A的頭結點,curB指向鏈表B的頭結點:

我們求出兩個鏈表的長度,并求出兩個鏈表長度的差值,然后讓curA移動到,和curB 末尾對齊的位置,如圖: 

此時我們就可以比較curA和curB是否相同,如果不相同,同時向后移動curA和curB,如果遇到curA == curB,則找到交點。

否則循環退出返回空指針。

C++代碼如下:

  1. class Solution { 
  2. public
  3.     ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { 
  4.         ListNode* curA = headA; 
  5.         ListNode* curB = headB; 
  6.         int lenA = 0, lenB = 0; 
  7.         while (curA != NULL) { // 求鏈表A的長度 
  8.             lenA++; 
  9.             curA = curA->next
  10.         } 
  11.         while (curB != NULL) { // 求鏈表B的長度 
  12.             lenB++; 
  13.             curB = curB->next
  14.         } 
  15.         curA = headA; 
  16.         curB = headB; 
  17.         // 讓curA為最長鏈表的頭,lenA為其長度 
  18.         if (lenB > lenA) { 
  19.             swap (lenA, lenB); 
  20.             swap (curA, curB); 
  21.         } 
  22.         // 求長度差 
  23.         int gap = lenA - lenB; 
  24.         // 讓curA和curB在同一起點上(末尾位置對齊) 
  25.         while (gap--) { 
  26.             curA = curA->next
  27.         } 
  28.         // 遍歷curA 和 curB,遇到相同則直接返回 
  29.         while (curA != NULL) { 
  30.             if (curA == curB) { 
  31.                 return curA; 
  32.             } 
  33.             curA = curA->next
  34.             curB = curB->next
  35.         } 
  36.         return NULL
  37.     } 
  38. }; 
  • 時間復雜度:
  • 空間復雜度:

其他語言版本

Java

  1. public class Solution { 
  2.     public ListNode getIntersectionNode(ListNode headA, ListNode headB) { 
  3.         ListNode curA = headA; 
  4.         ListNode curB = headB; 
  5.         int lenA = 0, lenB = 0; 
  6.         while (curA != null) { // 求鏈表A的長度 
  7.             lenA++; 
  8.             curA = curA.next
  9.         } 
  10.         while (curB != null) { // 求鏈表B的長度 
  11.             lenB++; 
  12.             curB = curB.next
  13.         } 
  14.         curA = headA; 
  15.         curB = headB; 
  16.         // 讓curA為最長鏈表的頭,lenA為其長度 
  17.         if (lenB > lenA) { 
  18.             //1. swap (lenA, lenB); 
  19.             int tmpLen = lenA; 
  20.             lenA = lenB; 
  21.             lenB = tmpLen; 
  22.             //2. swap (curA, curB); 
  23.             ListNode tmpNode = curA; 
  24.             curA = curB; 
  25.             curB = tmpNode; 
  26.         } 
  27.         // 求長度差 
  28.         int gap = lenA - lenB; 
  29.         // 讓curA和curB在同一起點上(末尾位置對齊) 
  30.         while (gap-- > 0) { 
  31.             curA = curA.next
  32.         } 
  33.         // 遍歷curA 和 curB,遇到相同則直接返回 
  34.         while (curA != null) { 
  35.             if (curA == curB) { 
  36.                 return curA; 
  37.             } 
  38.             curA = curA.next
  39.             curB = curB.next
  40.         } 
  41.         return null
  42.     } 
  43.  

Python

  1. class Solution: 
  2.     def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode: 
  3.         ""
  4.         根據快慢法則,走的快的一定會追上走得慢的。 
  5.         在這道題里,有的鏈表短,他走完了就去走另一條鏈表,我們可以理解為走的快的指針。 
  6.  
  7.         那么,只要其中一個鏈表走完了,就去走另一條鏈表的路。如果有交點,他們最終一定會在同一個 
  8.         位置相遇 
  9.         ""
  10.         cur_a, cur_b = headA, headB     # 用兩個指針代替a和b 
  11.  
  12.  
  13.         while cur_a != cur_b: 
  14.             cur_a = cur_a.next if cur_a else headB      # 如果a走完了,那么就切換到b走 
  15.             cur_b = cur_b.next if cur_b else headA      # 同理,b走完了就切換到a 
  16.  
  17.         return cur_a 

Go

  1. func getIntersectionNode(headA, headB *ListNode) *ListNode { 
  2.     curA := headA 
  3.     curB := headB 
  4.     lenA, lenB := 0, 0 
  5.     // 求A,B的長度 
  6.     for curA != nil { 
  7.         curA = curA.Next 
  8.         lenA++ 
  9.     } 
  10.     for curB != nil { 
  11.         curB = curB.Next 
  12.         lenB++ 
  13.     } 
  14.     var step int 
  15.     var fast, slow *ListNode 
  16.     // 請求長度差,并且讓更長的鏈表先走相差的長度 
  17.     if lenA > lenB { 
  18.         step = lenA - lenB 
  19.         fast, slow = headA, headB 
  20.     } else { 
  21.         step = lenB - lenA 
  22.         fast, slow = headB, headA 
  23.     } 
  24.     for i:=0; i < step; i++ { 
  25.         fast = fast.Next 
  26.     } 
  27.     // 遍歷兩個鏈表遇到相同則跳出遍歷 
  28.     for fast != slow { 
  29.         fast = fast.Next 
  30.         slow = slow.Next 
  31.     } 
  32.     return fast 

javaScript

  1. var getListLen = function(head) { 
  2.     let len = 0, cur = head; 
  3.     while(cur) { 
  4.        len++; 
  5.        cur = cur.next
  6.     } 
  7.     return len; 
  8. var getIntersectionNode = function(headA, headB) { 
  9.     let curA = headA,curB = headB, 
  10.         lenA = getListLen(headA), 
  11.         lenB = getListLen(headB); 
  12.     if(lenA < lenB) { 
  13.         [curA, curB] = [curB, curA]; 
  14.         [lenA, lenB] = [lenB, lenA]; 
  15.     } 
  16.     let i = lenA - lenB; 
  17.     while(i-- > 0) { 
  18.         curA = curA.next 
  19.     } 
  20.     while(curA && curA !== curB) { 
  21.         curA = curA.next
  22.         curB = curB.next
  23.     } 
  24.     return curA; 
  25. }; 

 

責任編輯:姜華 來源: 代碼隨想錄
相關推薦

2021-01-28 07:33:34

JavaScript鏈表數據

2021-03-10 08:42:19

Java數據結構算法

2021-07-13 07:52:03

Python數據結構

2021-07-15 06:43:12

Python數據結構

2017-03-01 13:58:46

Python數據結構鏈表

2020-10-30 09:56:59

Trie樹之美

2022-09-21 07:57:33

二叉搜索樹排序二叉樹

2022-09-26 07:56:53

AVL算法二叉樹

2020-10-21 14:57:04

數據結構算法圖形

2012-02-02 10:21:05

單鏈表nexthead

2023-03-08 08:03:09

數據結構算法歸并排序

2020-10-20 08:14:08

算法與數據結構

2020-12-31 05:31:01

數據結構算法

2022-01-18 19:13:52

背包問題數據結構算法

2023-10-27 07:04:20

2020-10-12 11:48:31

算法與數據結構

2021-03-11 08:53:20

Java數據結構算法

2021-12-08 11:31:43

數據結構算法合并區間

2021-12-10 11:27:59

數據結構算法單調遞增的數字

2021-12-21 11:39:01

數據結構算法同構字符串
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: av在线播放一区二区 | 精品国产精品国产偷麻豆 | 国产精品色 | 日本不卡一区二区 | 欧美日韩久久久 | 日韩黄色小视频 | 很黄很污的网站 | 成在线人视频免费视频 | 日日射影院 | 久草日韩 | www.国产精 | 欧美日韩在线一区二区 | 国产我和子的乱视频网站 | 欧美精品欧美精品系列 | a级在线免费视频 | 91在线视频免费观看 | 天天综合网天天综合色 | 国产精品视频不卡 | 精品无码久久久久久久动漫 | 一区二区三区在线免费观看 | 羞羞视频网站免费看 | 日韩精品视频中文字幕 | 夜夜骑天天干 | 亚洲男人网 | 最新国产福利在线 | 欧美性视频在线播放 | 久久日韩精品一区二区三区 | 欧美日韩1区2区3区 欧美久久一区 | 性欧美hd | 亚洲在线一区二区 | 欲色av | 久久精品国产一区二区电影 | 久久骚 | 久视频在线观看 | 日韩成人在线观看 | 国产久视频 | 91精品国产综合久久久动漫日韩 | 青青草网 | 日韩一区不卡 | 久久一区二区视频 | 日韩视频在线观看中文字幕 |