lc160 怎样用递归写法呢?

来源:5-3 设立链表的虚拟头结点 Remove Linked List Elements

Y1ng

2019-11-22

lc160,虽然“Your code should preferably run in O(n) time and use only O(1) memory. ”。
直觉上这题可以用递归。但我尝试写一直有bug,最主要的原因是子函数的input有问题。
请问有没有人能给一个递归写法,谢谢!

写回答

2回答

Y1ng

提问者

2019-11-22

提供一个性能较好的非递归写法:

// O(m + n)
// O(1)
public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        if(getLastNode(headA) != getLastNode(headB)) {
            return null;
        }
        
        ListNode pA = headA, pB = headB;
        while(pA != pB) {
            pA = (pA.next == null)? headB : pA.next;
            pB = (pB.next == null)? headA : pB.next;
        }
        return pA;
    }
    
    private ListNode getLastNode(ListNode head) {
        ListNode curr = head;
        while(curr != null && curr.next != null) {
            curr = curr.next;
        }
        return curr;
    }
}

一开始依然得判断交集是否为null

0
0

liuyubobobo

2019-11-22

这个问题完全没有必要使用递归。个人并不建议所有的问题都去寻求并不自然的递归(或者非递归)的解法。


不过问题放在这里,看看有没有同学会提供一个递归解法:)


继续加油!:)

0
6
liuyubobobo
回复
Y1ng
是的。继续加油!:)
2019-11-23
共6条回复

玩转算法面试-- Leetcode真题分门别类讲解

课程配套大量BAT面试真题,高频算法题解析,强化训练

7410 学习 · 1150 问题

查看课程