#160 Intersection of Two Linked Lists

来源:互联网 发布:匡恩网络 b轮 编辑:程序博客网 时间:2024/06/16 09:32

题目:

Write a program to find the node at which the intersection of two singly linked lists begins.


For example, the following two linked lists:

A:          a1 → a2                   ↘                     c1 → c2 → c3                   ↗            B:     b1 → b2 → b3

begin to intersect at node c1.


Notes:

  • If the two linked lists have no intersection at all, return null.
  • The linked lists must retain their original structure after the function returns.
  • You may assume there are no cycles anywhere in the entire linked structure.
  • Your code should preferably run in O(n) time and use only O(1) memory.

题解:

先跑一下两个链表,得到分别的长度(此时,可以顺便判断下尾节点是否相同,若不同,则不相交,返回null)。

然后长的链表先走m-n(长度差),再两个链表同步走,寻找公共节点。

/** * 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 lenA = 1;        int lenB = 1;        int num = 0;        ListNode tmpA = headA;        ListNode tmpB = headB;        ListNode tmp = null;        while(tmpA.next != null){            tmpA=tmpA.next;            lenA++;        }        while(tmpB.next != null){            tmpB=tmpB.next;            lenB++;        }        if(tmpA != tmpB) return null;                //tmpA为长的链表头结点        if(lenA>=lenB){            tmpA = headA;            tmpB = headB;        }        else{            tmpA = headB;            tmpB = headA;        }        //长链表先走|lenA-lenB|步,以补齐        while(num<Math.abs(lenA-lenB)){            tmpA = tmpA.next;            num++;        }        while(tmpA != tmpB){            tmpA = tmpA.next;            tmpB = tmpB.next;        }        return tmpA;    }}
代码虽长,流程思路还是很简单的。

PS:再吐槽下leetcode的Runtime,同一个代码,第一次运行304ms,第二次524ms,这么任性真的好么!

0 0
原创粉丝点击