【Java實現】兩個鏈表的第一個共同結點

題目描述

輸入兩個鏈表,找出它們的第一個公共結點。(注意因爲傳入數據是鏈表,所以錯誤測試數據的提示是用其他方式顯示的,保證傳入數據是正確的)

解題思路

直接運用雙指針法。創建兩個指針pre和cur,分別指向兩個鏈表的頭結點,然後依次往後遍歷。

這裏需要特別注意的是兩個鏈表的長度不一樣的情況:
如果某個指針到達末尾,則將該指針指向另一個鏈表的頭結點;如果兩個指針所指的節點相同,則循環結束,返回當前指針指向的節點。

比如兩個鏈表分別爲:1->3->5->6和2->4->8->9->5->6。
如果我們直接用雙指針進行遍歷,當第一個鏈表的指針pre走到尾部的時候,第二個鏈表的指針還沒走到尾部,沒法找到跟第一個鏈表相同的結點。所以我們需要進行處理,讓第一個鏈表走到尾部的時候指向第二個鏈表頭部,第二個鏈表走到尾部的時候指向第一個鏈表的頭部,然後接着往下走,即變成下面的情況
鏈表一: 1->3->5->6->2->4->8->9->5->6
鏈表二: 2->4->8->9->5->6->1->3->5->6
這樣兩條鏈表長度就相同了,如果存在共同結點pre就會指向他們的共同結點,否則pre就會是null。

代碼實現:

public class Solution {
    public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
        if(pHead1==null||pHead2==null)   return null;
        ListNode pre=pHead1;
        ListNode cur=pHead2;
        while(pre!=cur){
             pre=pre.next;
             cur=cur.next;
            if(pre!=cur){
              if(pre==null) pre=pHead1;
               if(cur==null) cur=pHead2;
             }
            }
      return pre;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章