相交鏈表

編寫一個程序,找到兩個單鏈表相交的起始節點。

如下面的兩個鏈表:

在這裏插入圖片描述

在節點 c1 開始相交。

思路:類似快慢指針,即雙指針
—官方給的答案:
當p1到達鏈表尾時,讓p1 = headB
當p2到達鏈表尾時,讓p2 = headA
這樣一定有 p1 == p2
如果p1、p2有交點,那p1 == p2 && p1!=null
如果沒有,p1 == p2 && p1==null;
–分析原因:
我的原因不太對推薦看leetcode官方分析,但這種題,看了也不太好自我分析
-話說以前做過,但這次做第二次還是不會,分析原因真的有用嗎?
—怎麼判斷有交點,p1 == p2時
—如果兩鏈表長度相等,那可以出現p1 == p2
—如果兩鏈表不相等,那一次同時遍歷兩個鏈表不可以出現p1 == p2
—我往把同時改成分別那樣想了,但
—由於相交節點之前的長度不一樣,我們讓短的,類似於走的快的,走完後,去走長的那條路,讓長的,走完後,去走短的路,,倆指針距第一交點的長度都一樣了,那肯定可以相交。
流程圖真好用,一次通過,還可以幫助找bug
在這裏插入圖片描述
/**

  • Definition for singly-linked list.

  • public class ListNode {

  • int val;
    
  • ListNode next;
    
  • ListNode(int x) {
    
  •     val = x;
    
  •     next = null;
    
  • }
    
  • }
    */
    public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
    ListNode p1 = headA;
    ListNode p2 = headB;

     if(p1 == null || p2 == null) return null;
     int count1 = 1;
     int count2 = 1;
     while( p1!=p2){
         p1 = p1.next;
         p2 = p2.next;
         if(p1 == null){
             if(count1 == 1){
                 p1 = headB;
                 count1++;
             }else{
                 return null;
             }
         }
         if(p2 == null){
             if(count2 == 1){
                 count2++;
                 p2 = headA;
             }else{
                 return null;
             }
         }
     }
     return p1;
    

    }
    }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章