隨筆-相交連結串列(巧妙解法)
阿新 • • 發佈:2018-12-28
題目:相交連結串列
方法一常規解法思路:採用雙指標先計算出兩條鏈的長度,然後求出差值,先讓長鏈走差值步,下來兩條鏈的長度一樣,然後開始比較,直到遇見相見的節點或者走完連結串列。
/** * 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) { if(headA==null || headB==null ){ return null; } int len1=0; int len2=0; ListNode cur1=headA; ListNode cur2=headB; while(cur1.next!=null || cur2.next!=null){ if(cur1.next!=null){ cur1=cur1.next; len1++; } if(cur2.next!=null){ cur2=cur2.next; len2++; } } if(cur1!=cur2){ //兩個連結串列最後一個元素不相同 return null; } if(len1<len2){ //長鏈為cur1 cur1=headB; cur2=headA; int tmp=len1; len1=len2; len2=tmp; }else{ cur1=headA; cur2=headB; } int len=len1-len2; while(cur1!=null){ if(len>0){ cur1=cur1.next; len--; continue; } if(cur1==cur2){ return cur1; }else{ cur1=cur1.next; cur2=cur2.next; } } return null; } }
方法二巧妙解法思路:邏輯思路分為兩輪,第一輪兩個連結串列一個一步的走,如果兩個連結串列的長度相等第一輪就可以直接判斷出來;如果不相等第一輪結束,讓cur1指向headB; cur2指向headA , 這個其實用的原理很簡單;lenA+lenB=lenB+lenA; 也就是說當短鏈走完轉長鏈繼續走。長鏈走完轉短鏈時,兩個鏈剩餘部分正好相等。
/** * 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) { if(headA==null || headB==null ){ return null; } ListNode cur1=headA; ListNode cur2=headB; while(cur1!=cur2){ cur1= cur1==null ? headB:cur1.next; cur2= cur2==null ? headA:cur2.next; } return cur1; } }