自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

開(kāi)發(fā) 前端 算法
給你兩個(gè)單鏈表的頭節(jié)點(diǎn) headA 和 headB ,請(qǐng)你找出并返回兩個(gè)單鏈表相交的起始節(jié)點(diǎn)。如果兩個(gè)鏈表沒(méi)有交點(diǎn),返回 null 。

[[441326]]

鏈表相交

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

給你兩個(gè)單鏈表的頭節(jié)點(diǎn) headA 和 headB ,請(qǐng)你找出并返回兩個(gè)單鏈表相交的起始節(jié)點(diǎn)。如果兩個(gè)鏈表沒(méi)有交點(diǎn),返回 null 。

圖示兩個(gè)鏈表在節(jié)點(diǎn) c1 開(kāi)始相交:

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

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

示例 1:

示例 2:

示例 3:

思路

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

為了方便舉例,假設(shè)節(jié)點(diǎn)元素?cái)?shù)值相等,則節(jié)點(diǎn)指針相等。

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

我們求出兩個(gè)鏈表的長(zhǎng)度,并求出兩個(gè)鏈表長(zhǎng)度的差值,然后讓curA移動(dòng)到,和curB 末尾對(duì)齊的位置,如圖: 

此時(shí)我們就可以比較curA和curB是否相同,如果不相同,同時(shí)向后移動(dòng)curA和curB,如果遇到curA == curB,則找到交點(diǎn)。

否則循環(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的長(zhǎng)度 
  8.             lenA++; 
  9.             curA = curA->next
  10.         } 
  11.         while (curB != NULL) { // 求鏈表B的長(zhǎng)度 
  12.             lenB++; 
  13.             curB = curB->next
  14.         } 
  15.         curA = headA; 
  16.         curB = headB; 
  17.         // 讓curA為最長(zhǎng)鏈表的頭,lenA為其長(zhǎng)度 
  18.         if (lenB > lenA) { 
  19.             swap (lenA, lenB); 
  20.             swap (curA, curB); 
  21.         } 
  22.         // 求長(zhǎng)度差 
  23.         int gap = lenA - lenB; 
  24.         // 讓curA和curB在同一起點(diǎn)上(末尾位置對(duì)齊) 
  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. }; 
  • 時(shí)間復(fù)雜度:
  • 空間復(fù)雜度:

其他語(yǔ)言版本

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的長(zhǎng)度 
  7.             lenA++; 
  8.             curA = curA.next
  9.         } 
  10.         while (curB != null) { // 求鏈表B的長(zhǎng)度 
  11.             lenB++; 
  12.             curB = curB.next
  13.         } 
  14.         curA = headA; 
  15.         curB = headB; 
  16.         // 讓curA為最長(zhǎng)鏈表的頭,lenA為其長(zhǎng)度 
  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.         // 求長(zhǎng)度差 
  28.         int gap = lenA - lenB; 
  29.         // 讓curA和curB在同一起點(diǎn)上(末尾位置對(duì)齊) 
  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ù)快慢法則,走的快的一定會(huì)追上走得慢的。 
  5.         在這道題里,有的鏈表短,他走完了就去走另一條鏈表,我們可以理解為走的快的指針。 
  6.  
  7.         那么,只要其中一個(gè)鏈表走完了,就去走另一條鏈表的路。如果有交點(diǎn),他們最終一定會(huì)在同一個(gè) 
  8.         位置相遇 
  9.         ""
  10.         cur_a, cur_b = headA, headB     # 用兩個(gè)指針代替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的長(zhǎng)度 
  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.     // 請(qǐng)求長(zhǎng)度差,并且讓更長(zhǎng)的鏈表先走相差的長(zhǎng)度 
  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.     // 遍歷兩個(gè)鏈表遇到相同則跳出遍歷 
  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é)任編輯:姜華 來(lái)源: 代碼隨想錄
相關(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-15 06:43:12

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

2017-03-01 13:58:46

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

2021-07-13 07:52:03

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

2020-12-31 05:31:01

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

2021-03-11 08:53:20

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

2020-10-12 11:48:31

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

2020-10-30 09:56:59

Trie樹(shù)之美

2022-09-21 07:57:33

二叉搜索樹(shù)排序二叉樹(shù)

2022-09-26 07:56:53

AVL算法二叉樹(shù)

2020-10-21 14:57:04

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

2012-02-02 10:21:05

單鏈表nexthead

2021-08-03 10:24:59

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

2023-03-08 08:03:09

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

2020-10-20 08:14:08

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

2021-07-16 04:57:45

Go算法結(jié)構(gòu)

2009-08-11 14:51:11

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

2022-01-18 19:13:52

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

2023-10-27 07:04:20

點(diǎn)贊
收藏

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