160. Intersection of Two Linked Lists
Stack
两个链表找交叉点,基本思路肯定是一直同步迭代指针直到出现临界情况。
指针正向迭代的临界情况是
开始指向同一个 node
,但因为链表长度可能不同,两个指针直接同步移动会错开,打不到同一个node上。没办法正向就反向,临界变成了
开始指向不同 node
,而在临界前只需要同步移动指针(一直指的相同node)即可。怎么实现反向迭代呢?给
ListNode
对象加属性太麻烦了,直接stack
记录链接关系,然后一直pop
即可实现反向。
砍头统一
正向迭代移动指针的问题是,两个链表交叉的位置可能跟两个
head
的距离不一样,导致没办法同步移动。那就想办法让这两个距离一样。
直接先跑完两个链表,分别记录长度,计算长度差
diff
,然后把长的那个砍掉头上的diff
,实现两个链表长度一致的情况。然后开始同步移动指针,指针指向位置相同即为intersection的开始。
这道题拿 Python 写的时候很适合复习知识点:
==
和is
在python有什么不同?前者是变量内容是否相等,后者是变量是否指向内存中同一个地址。虽然这题==
在这个方法里也可以,但is
还是严谨一些。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
stack<ListNode*> A, B;
ListNode *curA = headA, *curB = headB;
while(curA) {
A.push(curA);
curA = curA->next;
}
while(curB) {
B.push(curB);
curB = curB->next;
}
ListNode *prev = NULL;
while(!A.empty() && !B.empty() && (A.top()==B.top())) {
prev = A.top();
A.pop();
B.pop();
}
return prev; // 函数指定返回的是指针
}
};
比较讨巧的解法是借鉴Q202用过的龟兔赛跑。
202. Happy NumberLast updated
Was this helpful?