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

數(shù)據(jù)結(jié)構(gòu)與算法之鏈表相交,找交點

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

[[441326]]

鏈表相交

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

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

圖示兩個鏈表在節(jié)點 c1 開始相交:

題目數(shù)據(jù) 保證 整個鏈?zhǔn)浇Y(jié)構(gòu)中不存在環(huán)。

注意,函數(shù)返回結(jié)果后,鏈表必須 保持其原始結(jié)構(gòu) 。

示例 1:

示例 2:

示例 3:

思路

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

為了方便舉例,假設(shè)節(jié)點元素數(shù)值相等,則節(jié)點指針相等。

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

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

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

否則循環(huán)退出返回空指針。

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. }; 
  • 時間復(fù)雜度:
  • 空間復(fù)雜度:

其他語言版本

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.         根據(jù)快慢法則,走的快的一定會追上走得慢的。 
  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. }; 

 

責(zé)任編輯:姜華 來源: 代碼隨想錄
相關(guān)推薦

2021-01-28 07:33:34

JavaScript鏈表數(shù)據(jù)

2021-03-10 08:42:19

Java數(shù)據(jù)結(jié)構(gòu)算法

2021-07-13 07:52:03

Python數(shù)據(jù)結(jié)構(gòu)

2021-07-15 06:43:12

Python數(shù)據(jù)結(jié)構(gòu)

2017-03-01 13:58:46

Python數(shù)據(jù)結(jié)構(gòu)鏈表

2020-12-31 05:31:01

數(shù)據(jù)結(jié)構(gòu)算法

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

數(shù)據(jù)結(jié)構(gòu)算法圖形

2020-10-12 11:48:31

算法與數(shù)據(jù)結(jié)構(gòu)

2021-03-11 08:53:20

Java數(shù)據(jù)結(jié)構(gòu)算法

2023-03-08 08:03:09

數(shù)據(jù)結(jié)構(gòu)算法歸并排序

2012-02-02 10:21:05

單鏈表nexthead

2020-10-20 08:14:08

算法與數(shù)據(jù)結(jié)構(gòu)

2021-08-03 10:24:59

數(shù)據(jù)跳躍鏈表結(jié)構(gòu)

2023-10-27 07:04:20

2022-01-18 19:13:52

背包問題數(shù)據(jù)結(jié)構(gòu)算法

2009-08-11 14:51:11

C#數(shù)據(jù)結(jié)構(gòu)與算法

2021-07-16 04:57:45

Go算法結(jié)構(gòu)
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 亚洲性综合网 | 国产激情视频在线观看 | 国内精品视频 | 国产999精品久久久久久绿帽 | 日本中文字幕在线观看 | 先锋资源网站 | 成人免费网站 | 日日摸夜夜添夜夜添特色大片 | 在线 丝袜 欧美 日韩 制服 | 中文字幕亚洲一区二区三区 | 亚洲精品二区 | 免费av一区二区三区 | 精品欧美一区二区三区久久久 | 午夜久久久 | 日韩精品一区二区三区中文在线 | 日本一区二区三区在线观看 | 91不卡 | 欧美日韩中文在线 | 亚洲一区二区电影网 | 国产精品国产成人国产三级 | 日韩精品一区二区三区在线观看 | av一级在线观看 | 久久国| 在线视频成人 | 免费亚洲成人 | 一呦二呦三呦国产精品 | 毛片一区二区三区 | 久久亚 | 日韩av资源站 | 色综合中文 | 麻豆视频国产在线观看 | 精品欧美一区二区三区久久久 | 嫩呦国产一区二区三区av | 国产一区二区三区高清 | 日韩电影一区 | 国产精品久久久久国产a级 欧美日韩国产免费 | 国产精品无码久久久久 | 日韩视频中文字幕 | 国产精品视频一区二区三 | 日韩久久久一区二区 | 精品国产一二三区 |