[问题]:
基于顺序表长度计算的相关定位算法
要定位两条链表中交叉结点的位置:E(4)
[lenLink1] [Common]
(Link1)L(9)->A(8)-> B(7) ->C(6) ->D(5)-> E(4) ->G(3)->T(2)->W(1)->P(0)
/
(Link2) F(8)->O(7)->H(6) ->Q(5) ->
[lenLink2]
刚开始想到遍历两个链表,把两个链表分别装入两个不同的栈空间中,然后同步出栈:
比较两个栈中栈顶元素,
若相同,则两个栈的栈顶元素出栈
若不同,则交叉结点是“之前”记录的栈顶元素(第一次时考虑没交叉结点的情况)
虽然这种复杂度较链表逆序的复杂度要低一些,但是最简单的办法是如下 :
利用链表长度,计算出长度的差值,然后使得两个链表的较长的那个链表的指针先走差值个元素。
然后两条链表的指针齐步走,判断走到的结点是否为同一结点,“是”则定位到了该交叉结点, “否”则继续走。
如果最后都走到链表结尾,依然不同,则判断出两天链表不相交,没有交叉结点。
[解答]
输出:
(1)CreateCrossLinkList(link1, link2, 5, 5, 4); 时 是示例的情况 :
Cross Node:4
(2)CreateCrossLinkList(link1, link2, 0, 5, 4); 时 是不相交的情况:
There is no cross node