6/11, LinkedList 杂题

6/11, LinkedList 杂题

最早听到这题还是夏天实习吃饭的时候,现在也不知道那哥们都在忙啥。

public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        int lenA = 0;
        int lenB = 0;
        ListNode ptrA = headA;
        ListNode ptrB = headB;
        while(ptrA != null){
            ptrA = ptrA.next;
            lenA ++;
        }
        while(ptrB != null){
            ptrB = ptrB.next;
            lenB ++;
        }

        ptrA = headA;
        ptrB = headB;

        if(lenA > lenB){
            for(int i = 0; i < lenA - lenB; i++){
                ptrA = ptrA.next;
            }
        } else {
            for(int i = 0; i < lenB - lenA; i++){
                ptrB = ptrB.next;
            }
        }

        while(ptrA != ptrB){
            ptrA = ptrA.next;
            ptrB = ptrB.next;
        }

        return ptrA;
    }
}

O(n) 时间,O(1) 空间。好久不写链表了,感觉写的有点粗糙。。

用都指向 head 的快慢指针可以判断链表长度奇偶,最后 fast == null 的时候为偶,slow 指向后半单第一个节点;fast.next == null 的时候链表长度为奇数,slow 指向中间节点。

能这样 30秒 AC 的良心水题,已经不多了=。=

40 秒能 AC 的良心水题,也不多啊!

在 LeetCode 早期年代,这样的题居然可以算成 Hard 难度。。

拼接链表,认准多个 dummy node.

一开始想复杂了,还挑着拆成两个 list .. 其实就是注意下存中间两个 node,还有这两个 node 的 prev 与 next,循环解决就行。

Last updated

Was this helpful?